总列的错误,用于计算行值的总和

时间:2017-10-01 21:30:37

标签: sql sql-server tsql pivot aggregate-functions

我创建了一个数据透视查询,用于计算特定事务的总和,我想添加额外的列来计算每个ID的所有事务的总和,但我的总列只给所有ID的空值,任何人都可以帮助那? 这是我的查询:

SELECT 
  AccountID
, OpeningBalance
, OpeningBalanceStatus
, ISNULL([CI], 0) AS CI
, ISNULL([CO], 0) AS CO
, ISNULL([SI], 0) AS SI
, ISNULL([CN], 0) AS CN
, ISNULL([PI], 0) AS PI
, ISNULL([JE], 0) AS JE
, ISNULL([NR], 0) AS NR
, [OpeningBalance]+[CI]+[CO]+[SI]+[CN]+[PI]+[JE]+[NR] AS TOTAL
FROM (SELECT  
    Accounting.AccDocumentDetails.AccountID
  , Accounting.AccDocumentDetails.AmountStatus
  , Accounting.AccAccounts.AccountType
  , Accounting.AccDocumentHeader.CodeTypePart
  , AccAccounts_1.OpeningBalance
  , AccAccounts_1.OpeningBalanceStatus
  , CASE 
       WHEN AmountStatus = 'd' 
          THEN (Amount * 1) 
       WHEN AmountStatus = 'C' 
          THEN (Amount * - 1) 
       END AS NewAmount FROM Accounting.AccDocumentDetails
INNER JOIN Accounting.AccAccounts 
       ON Accounting.AccDocumentDetails.AccountID = Accounting.AccAccounts.ID 
 INNER JOIN Accounting.AccChartOfAccounts 
       ON Accounting.AccChartOfAccounts.ID = Accounting.AccAccounts.ParentNode 
 INNER JOIN Accounting.AccDocumentHeader 
       ON Accounting.AccDocumentDetails.AccDocumentHeaderID = Accounting.AccDocumentHeader.ID 
 INNER JOIN Accounting.AccAccounts AS AccAccounts_1 
       ON Accounting.AccDocumentDetails.AccountID = AccAccounts_1.ID) AS PivotSelect PIVOT( SUM(NewAmount) FOR CodeTypePart IN ([ci],[CO],[SI],[CN],[PI],[JE],[NR]) ) AS PVT

这是我的输出 enter image description here

2 个答案:

答案 0 :(得分:2)

获得总列的一种方法是,您可以将查询用作子查询,然后在外部查询上创建总计算。或者您也可以使用cte

WITH t_pvt AS (
SELECT  AccountID
       ,OpeningBalance
       ,OpeningBalanceStatus
       ,ISNULL([CI], 0) AS CI
       ,ISNULL([CO], 0) AS CO
       ,ISNULL([SI], 0) AS SI
       ,ISNULL([CN], 0) AS CN
       ,ISNULL([PI], 0) AS PI
       ,ISNULL([JE], 0) AS JE
       ,ISNULL([NR], 0) AS NR       
  FROM (SELECT  Accounting.AccDocumentDetails.AccountID
                ,Accounting.AccDocumentDetails.AmountStatus
                ,Accounting.AccAccounts.AccountType
                ,Accounting.AccDocumentHeader.CodeTypePart
                ,AccAccounts_1.OpeningBalance
                ,AccAccounts_1.OpeningBalanceStatus
                ,CASE WHEN AmountStatus = 'd' 
                      THEN (Amount * 1) 
                      WHEN AmountStatus = 'C' 
                      THEN (Amount * - 1) 
                 END AS NewAmount 
          FROM Accounting.AccDocumentDetails
         INNER JOIN Accounting.AccAccounts 
            ON Accounting.AccDocumentDetails.AccountID = Accounting.AccAccounts.ID 
         INNER JOIN Accounting.AccChartOfAccounts 
            ON Accounting.AccChartOfAccounts.ID = Accounting.AccAccounts.ParentNode 
         INNER JOIN Accounting.AccDocumentHeader 
            ON Accounting.AccDocumentDetails.AccDocumentHeaderID = Accounting.AccDocumentHeader.ID 
         INNER JOIN Accounting.AccAccounts AS AccAccounts_1 
            ON Accounting.AccDocumentDetails.AccountID = AccAccounts_1.ID) AS PivotSelect 
 PIVOT (SUM(NewAmount) 
        FOR CodeTypePart IN ([ci],[CO],[SI],[CN],[PI],[JE],[NR])) AS PVT
)

SELECT *
       ,[OpeningBalance]+[CI]+[CO]+[SI]+[CN]+[PI]+[JE]+[NR] AS TOTAL
  FROM t_pvt

答案 1 :(得分:1)

With CTE
AS
( select column1 as c1 from tbl)
Select c1 from CTE

这是CTE语法的一个简单示例以及如何使用它