sql-server - SQL Server PIVOT - 多个聚合

标签 sql-server tsql pivot aggregation

给定以下结果集:

---------------------------------------------------------
CustomerID  Service  TransType  SubTotal   Tax   NetTotal
---------------------------------------------------------
106            A        CREDIT     12.52     -      12.52 
106            A        CREDIT     10.07     -      10.07
106            B        CREDIT      2.00     -       2.00
106            C        REMOTE      5.99     -       5.99
106            C        CREDIT      5.99     -       5.99
106            C        CREDIT      3.99  0.30       3.69
106            C        CREDIT      5.99  0.30       5.69
106            D        CREDIT      5.99     -       5.99
---------------------------------------------------------

请注意,NetTotal = 小计 - 税金

请帮我计算 sum(SubTotal)、sum(Tax) 和 sum(NetTotal),以及透视 TransType,如下所示:

--------------------------------------------------------------------------
CustomerID  Service  Cash  Check  Credit  Remote  SubTotal   Tax  NetTotal
--------------------------------------------------------------------------
106            A        0      0   22.59       0     22.59     0     22.59   
106            B        0      0    2.00       0      2.00     0      2.00    
106            C        0      0   15.97    5.99     21.96  0.60     21.36    
106            D        0      0    5.99       0      5.99     0      5.99    
--------------------------------------------------------------------------

如果我只有 1 列要汇总,那么使用 PIVOT 就可以直接进行,但我不确定如何获取 3 个汇总 - 用于小计、税收和净计。

感谢您的帮助!

最佳答案

这可以在没有 PIVOT 的情况下完成:

SELECT 
  CustomerID
, [Service]
, Cash = SUM(case when TransType='CASH' then SubTotal else 0 end)
, [Check] = SUM(case when TransType='CHECK' then SubTotal else 0 end)
, Credit = SUM(case when TransType='CREDIT' then SubTotal else 0 end)
, [Remote] = SUM(case when TransType='REMOTE' then SubTotal else 0 end)
, SubTotal = SUM(SubTotal)
, Tax = SUM(Tax)
, NetTotal = SUM(NetTotal)
FROM YourTable
GROUP BY CustomerId, [Service]

使用 PIVOT,事情会变得更加复杂。我能想到的最简单的方法是在不同的查询中计算 SubTotal、Tax 和 NetTotal,然后使用联接组合查询。下面的例子;为了使查询简单,我放弃了现金和支票。

SELECT  
  a.CustomerId
, a.Service
, Credit = a.Credit
, [Remote] = a.[Remote]
, SubTotal = SUM(b.SubTotal)
, Tax = SUM(b.Tax)
, NetTotal = SUM(b.NetTotal)
FROM (
    SELECT 
      CustomerId
    , [Service]
    , Credit = SUM(Credit)
    , [Remote] = SUM([Remote])
    FROM YourTable a
    PIVOT
    (
        SUM(SubTotal) FOR [TransType] IN ([Credit],[Remote])
    ) pvt
    GROUP BY CustomerId, [Service]
) a
INNER JOIN YourTable b 
    ON a.CustomerID = b.CustomerID 
    AND a.[Service] = b.[Service]
GROUP BY a.CustomerId, a.[Service], a.Credit, a.[Remote]

关于sql-server - SQL Server PIVOT - 多个聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1243567/

相关文章:

sql - 创建一个触发器,在更新行时将旧值插入到其他表中

sql - 如何将 FOR XML Path 的输出存储在变量中?

sql-server - 是否需要回滚事务?

sql - 是否可以向外键添加逻辑约束?

sql - 公用表表达式 'cte' 的递归成员有多个递归引用?

sql-server - SQL Server 2012 : How to find common values in a column

sql-server - SqlServer2008 - 当标量函数在很多地方被引用时我可以更改它吗

sql - T-SQL - 按周旋转

python - 如何将melt/wide_to_long应用于具有多列的数据框?

mysql - 如何在 MySQL 中返回数据透视表输出?