sqlserverLAG函数

sqlserver里做环比,使用LAG函数,求出来的环比上期金额不对。

代码如下

SELECT D.日期,

SUM(D.金额)AS 金额,C.SUPPLIER_NAME AS 供应商,

LAG(SUM(D.金额),1) OVER (PARTITION BY C.SUPPLIER_NAME ORDER BY D.[日期] ) AS 上期金额

 FROM 

(

SELECT CONVERT(VARCHAR(7),A.DOC_DATE,23) as 日期,SUM(B.AMT_FC) AS 金额,SETTLEMENT_SUPPLIER_ID FROM PAYABLE_DOC A 

LEFT JOIN PAYABLE_DOC_D B 

ON A.PAYABLE_DOC_ID=B.PAYABLE_DOC_ID

where A.DOC_DATE>=DATEADD(year,-2,GETDATE())

GROUP BY A.DOC_DATE,DOC_DATE,SETTLEMENT_SUPPLIER_ID) AS D 

left join SUPPLIER C 

ON D.SETTLEMENT_SUPPLIER_ID=C.SUPPLIER_BUSINESS_ID

WHERE 

 C.SUPPLIER_NAME like '%肯纳司太%'

GROUP BY D.日期,C.SUPPLIER_NAME

20241026.png

SQL Filasy 发布于 2024-10-26 14:48
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
0
ChazzenLv2初级互助
发布于2024-10-28 09:34

看了下你SQL没啥问题,你这是navicat 显示问题吧,你把最后一个字段的宽度拉宽一点,看你应该是显示不全

image.png

你小数位保留的太多了,可以用round()留两位小数

最佳回答
0
华莉星宸Lv7资深互助
发布于2024-10-26 15:30(编辑于 2024-10-26 15:37)

参考这个

https://www.jb51.net/database/2854728wq.htm

image.png---------------------------------------

SELECT D.日期,       

       D.金额 AS 金额,

       C.SUPPLIER_NAME AS 供应商,       

       LAG(D.金额) OVER(PARTITION BY C.SUPPLIER_NAME ORDER BY D.日期) AS 上期金额

  FROM (        

        SELECT CONVERT(VARCHAR(7), A.DOC_DATE, 23) as 日期,

                SUM(B.AMT_FC) AS 金额,

                SETTLEMENT_SUPPLIER_ID

          FROM PAYABLE_DOC A        

          LEFT JOIN PAYABLE_DOC_D B        

            ON A.PAYABLE_DOC_ID = B.PAYABLE_DOC_ID        

         where A.DOC_DATE >= DATEADD(year, -2, GETDATE())        

         GROUP BY CONVERT(VARCHAR(7), A.DOC_DATE, 23), SETTLEMENT_SUPPLIER_ID) AS D

  left join SUPPLIER C

    ON D.SETTLEMENT_SUPPLIER_ID = C.SUPPLIER_BUSINESS_ID

 WHERE

 C.SUPPLIER_NAME like '%肯纳司太%'

 GROUP BY D.日期, C.SUPPLIER_NAME

  • Filasy Filasy(提问者) 请问你用的是navicat软件嘛,我用这个软件,结果显示不对,使用SQL的软件结果就对的。
    2024-10-26 15:35 
  • 华莉星宸 华莉星宸 回复 Filasy(提问者) 我没去具体的执行,你看看上面修改的
    2024-10-26 15:36 
  • Filasy Filasy(提问者) 回复 华莉星宸 原来的代码在mssm上运行是对的
    2024-10-26 15:40 
最佳回答
0
CD20160914Lv8专家互助
发布于2024-10-27 20:40(编辑于 2024-10-27 20:46)

这样是可以的

-----------------------------------------------------------------------------

SELECT 

tmp.日期,

tmp.供应商,

tmp.金额 as 当期金额,

LAG(tmp.金额, 1) OVER (PARTITION BY tmp.供应商 ORDER BY tmp.日期) AS 环比金额

 FROM

(

SELECT 

CONVERT(VARCHAR(7),A.DOC_DATE,23) as 日期,

SUM(B.AMT_FC) AS 金额,

C.SUPPLIER_NAME AS 供应商

FROM PAYABLE_DOC A 

LEFT JOIN PAYABLE_DOC_D B ON A.PAYABLE_DOC_ID=B.PAYABLE_DOC_ID

left join SUPPLIER b on SETTLEMENT_SUPPLIER_ID=C.SUPPLIER_BUSINESS_ID

where A.DOC_DATE>=DATEADD(year,-2,GETDATE())

and   C.SUPPLIER_NAME like '%肯纳司太%'

GROUP BY CONVERT(VARCHAR(7),A.DOC_DATE,23),C.SUPPLIER_NAME

) tmp

我电脑中测试的环比查询,按年月与供应商分开了的

image.png

  • 4关注人数
  • 229浏览人数
  • 最后回答于:2024-10-28 09:34
    请选择关闭问题的原因
    确定 取消
    返回顶部