从数据透视表-SQL Server / SAP B1中求和各个动态列

问题描述

我写了一个基于SAP Business One DB的SQL Server查询,我有一个动态列列表,我正在PIVOT中使用这些列来创建动态column.im,因为经过“ PrcName”传递后,它们当前正在获取单独的数据。归入Pivot。 我希望能够对#TEMP表中的每个动态列求和,以求和各个“ PrcName”行。就是这样:SUM('+ @Columns +')

下面的查询给我这样的东西:

Type    FatherAccount   levels  AcctCode    AccntntCod  AcctName    Group1  Group2   Project1   Project2
Expense Cost    11  1000002 400002  Resource    0   0   1000    0
Expense Cost    11  1000002 400002  Resource    0   0   0   2000

但是我试图将它们总结为:

Type    FatherAccount   levels  AcctCode    AccntntCod  AcctName    Group1  Group2   Project1   Project2
Expense Cost    11  1000002 400002  Resource    0   0   1000    2000

SQL查询:

SELECT * INTO #TEMP FROM(


SELECT Type,FatherAccount,Levels,[AcctCode],[AccntntCod],[AcctName],[Tender],[OverHead],' + @Columns + '
FROM
(SELECT  
CASE WHEN T0.GroupMask IN (''4'') THEN ''Revenue'' ELSE ''Expense'' END AS "Type",T5.AcctName AS "FatherAccount",''11'' AS Levels,T0.[AcctCode],T0.[AccntntCod],T0.[AcctName],CASE WHEN T2.PrcName LIKE ''%Group1%'' THEN SUM(T1.[Debit] - T1.[Credit])END AS Group1",CASE WHEN T2.PrcName LIKE ''%Group2%'' THEN SUM(T1.[Debit] - T1.[Credit])END AS "Group1",SUM(T1.[Debit] - T1.[Credit]) AS Balance,T2.[PrcName] AS PrcName,ROW_NUMBER() OVER(PARTITION BY T0.AcctName,SUM(T1.[Debit] - T1.[Credit]) ORDER BY T0.AcctCode DESC) rn
FROM OACT T0  
LEFT JOIN JDT1 T1 ON T0.[AcctCode] = T1.[Account]
LEFT JOIN OPRC T2 ON T2.PrcCode = T1.ProfitCode
LEFT JOIN OPRC T3 ON T3.PrcCode = T1.OcrCode2
LEFT JOIN OPRC T4 ON T4.PrcCode = T1.OcrCode3
LEFT JOIN OACT T5 ON T5.AcctCode = T0.FatherNum

WHERE T0.GroupMask IN (''4'',''5'',''6'',''7'') AND (T0.Postable = ''Y'')
AND ((T1.RefDate Between ''[%0]'' AND ''[%1]'') OR T0.CurrTotal = 0)
AND (T4.PrcName = ''[%2]'' OR T0.CurrTotal = 0)
--GROUP BY GROUPING SETS ((T0.Levels,T5.AcctName,T2.PrcName,T0.GroupMask),(T5.AcctName))
--GROUP BY T0.Levels,T0.GroupMask
) as PivotData

PIVOT
(
   SUM(Balance)
   FOR PrcName IN (' + @Columns + ')
) AS PivotResult
) AS #TEMP



SELECT T0.Type,T0.FatherAccount,T0.levels,T0.AcctCode,T0.AccntntCod,T0.AcctName,SUM(T0.Group1) AS Group1,SUM(T0.Group2) AS Group1,SUM(' + @Columns + ')

FROM #TEMP T0 
GROUP BY T0.Type,' + @Columns + '

ORDER BY Type,FatherAccount

感谢您的帮助!

解决方法

不将PrcName列中的值添加到数据透视表中,此查询是否返回正确的输出?

SELECT CASE WHEN T0.GroupMask IN ('4') THEN 'Revenue' ELSE 'Expense' END AS [Type],T5.AcctName AS FatherAccount,'11' AS Levels,T0.[AcctCode],T0.[AccntntCod],T0.[AcctName],T2.[PrcName] AS PrcName,sum(CASE WHEN T2.PrcName LIKE '%Group1%' THEN (T1.[Debit] - T1.[Credit]) else 0 END) AS Group1,sum(CASE WHEN T2.PrcName LIKE '%Group2%' THEN (T1.[Debit] - T1.[Credit]) else 0 END) AS Group2,SUM(T1.[Debit] - T1.[Credit]) AS Balance
FROM OACT T0  
     LEFT JOIN JDT1 T1 ON T0.[AcctCode] = T1.[Account]
     LEFT JOIN OPRC T2 ON T2.PrcCode = T1.ProfitCode
     LEFT JOIN OPRC T3 ON T3.PrcCode = T1.OcrCode2
     LEFT JOIN OPRC T4 ON T4.PrcCode = T1.OcrCode3
     LEFT JOIN OACT T5 ON T5.AcctCode = T0.FatherNum
WHERE T0.GroupMask IN ('4','5','6','7') 
      AND (T0.Postable = 'Y')
      AND ((T1.RefDate Between '[%0]' AND '[%1]') OR T0.CurrTotal = 0)
      AND (T4.PrcName = '[%2]' OR T0.CurrTotal = 0)
GROUP BY [Type],T5.AcctName,T2.PrcName;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...