Dynamic Pivot SQL帮助

2020-08-31 03:57发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我有一个下面的数据透视表,我想使日期范围动态化,所以我不必每年都修改查询。

有人可以指出正确的方向吗? 我在网上查看了多个示例,但我不知道从哪里开始

选择*
 来自(
     选择
          a.CardCode,a.CardName,a.LineTotal,CAST(datepart(yy,a.docdate)as varchar)作为DocYear
     FROM InvLessCred a.cardcode = b.cardcode内部联接OSLP上的左外部联接OCRD B c ON b。[SlpCode] = c。[SlpCode]
  左OUTER JOIN UFD1 d ON b。[U_AccMan] = d。[FldValue] AND TableID ='OCRD'和FieldID = 20 WHERE a.CardCode ='TEST'
 )作为t
 枢
 (
     SUM(t.LineTotal)
     FOR [DocYear] IN
     (
 [2015],[2016],[2017],[2018],[2019],[2020]
 )
     )作为h 

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我有一个下面的数据透视表,我想使日期范围动态化,所以我不必每年都修改查询。

有人可以指出正确的方向吗? 我在网上查看了多个示例,但我不知道从哪里开始

选择*
 来自(
     选择
          a.CardCode,a.CardName,a.LineTotal,CAST(datepart(yy,a.docdate)as varchar)作为DocYear
     FROM InvLessCred a.cardcode = b.cardcode内部联接OSLP上的左外部联接OCRD B c ON b。[SlpCode] = c。[SlpCode]
  左OUTER JOIN UFD1 d ON b。[U_AccMan] = d。[FldValue] AND TableID ='OCRD'和FieldID = 20 WHERE a.CardCode ='TEST'
 )作为t
 枢
 (
     SUM(t.LineTotal)
     FOR [DocYear] IN
     (
 [2015],[2016],[2017],[2018],[2019],[2020]
 )
     )作为h 
付费偷看设置
发送
4条回答
奄奄一息的小鱼
1楼-- · 2020-08-31 04:29

嗨,斯科特,

不确定动态性的含义,但通常来说,您需要添加WHERE子句:

 WHERE a.CardCode ='TEST'AND  ... 

例如,您可以执行以下操作,它将始终为您提供最长4年的数据:

 a.CardCode ='TEST'AND YEAR(  a.DocDate)> = DATEADD(YEAR,-4,GETDATE())

此致

Johan

bbpeas
2楼-- · 2020-08-31 04:13

嗨斯科特,

再看看,我意识到我的回答只限制了列中的数据。

关于此,

Johan

风早神人
3楼-- · 2020-08-31 04:12

嗨,Johan ,

日期年份是硬编码的,因此这些年份需要每年进行更新,我要编辑数据透视表,以便它自动显示今年以及最近5年的数据。

三十六小时_GS
4楼-- · 2020-08-31 04:20

嗨 Scott,

您可以尝试动态构建sql字符串,然后执行它。 像这样:

 DECLARE @SQL AS NVARCHAR(MAX)='SELECT *
 FROM(从YIN(DocDate)的OINV组中选择YEAR(DocDate)作为DocYear,sum(DocTotal)作为DocTotal)作为t
 枢
 (
     SUM(t.DocTotal)
     FOR [DocYear] IN
     ('
 声明@YEAR AS NVARCHAR(4)

 DECRSARE CRSR游标
 对于
 选择YEAR(DocDate)
 来自OINV
 按年份分组(DocDate)
 打开crsr
 从crsr获取下一个
 进入@YEAR
 @@ FETCH_STATUS = 0时
  开始

 /***在这里做东西***/
   SET @SQL = @SQL +'['+ @YEAR +'],'

   从crsr获取下一个
   进入@YEAR
  结束
 关闭crsr
 取消crsr
 SET @SQL =子字符串(@ SQL,1,(len(@SQL)-1))
 SET @SQL = @SQL +')
     )为h'
 执行(@SQL)
 

此致

Johan

一周热门 更多>