Sql server SQL Server PIVOT-多个聚合
鉴于以下结果集:Sql server SQL Server PIVOT-多个聚合,sql-server,tsql,pivot,aggregation,Sql Server,Tsql,Pivot,Aggregation,鉴于以下结果集: --------------------------------------------------------- CustomerID Service TransType SubTotal Tax NetTotal --------------------------------------------------------- 106 A CREDIT 12.52 - 12.52 106
---------------------------------------------------------
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
---------------------------------------------------------
请注意,净值=小计-税
请帮助我计算总和(小计)、总和(税)和总和(净额),以及数据透视转换类型,如下所示:
--------------------------------------------------------------------------
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
--------------------------------------------------------------------------
如果我只有一列要总结,那么使用PIVOT将是直接的,但我不确定如何获得3个汇总—小计、税和净额合计
谢谢你的帮助 你试过这样的东西吗
DECLARE @Table TABLE(
CustomerID INT,
[Service] VARCHAR(MAX),
TransType VARCHAR(MAX),
SubTotal FLOAT,
Tax FLOAT,
NetTotal FLOAT
)
INSERT INTO @Table (CustomerID,[Service],TransType,SubTotal,Tax,NetTotal)
SELECT 106, 'A', 'CREDIT', 12.52, 0 , 12.52
INSERT INTO @Table (CustomerID,[Service],TransType,SubTotal,Tax,NetTotal)
SELECT 106, 'A', 'CREDIT', 10.07, 0 , 10.07
INSERT INTO @Table (CustomerID,[Service],TransType,SubTotal,Tax,NetTotal)
SELECT 106, 'B', 'CREDIT', 2, 0 , 2
INSERT INTO @Table (CustomerID,[Service],TransType,SubTotal,Tax,NetTotal)
SELECT 106, 'C', 'REMOTE', 5.99, 0 , 5.99
INSERT INTO @Table (CustomerID,[Service],TransType,SubTotal,Tax,NetTotal)
SELECT 106, 'C', 'CREDIT', 5.99, 0 , 5.99
INSERT INTO @Table (CustomerID,[Service],TransType,SubTotal,Tax,NetTotal)
SELECT 106, 'C', 'CREDIT', 3.99, 0.3 , 3.69
INSERT INTO @Table (CustomerID,[Service],TransType,SubTotal,Tax,NetTotal)
SELECT 106, 'C', 'CREDIT', 5.99, 0.3 , 5.69
INSERT INTO @Table (CustomerID,[Service],TransType,SubTotal,Tax,NetTotal)
SELECT 106, 'D', 'CREDIT', 5.99, 0 , 5.99
SELECT Pivots.CustomerID,
Pivots.[Service],
Pivots.Cash,
Pivots.[Check],
Pivots.Credit,
Pivots.[Remote],
Total.SumSubTotal,
Total.SumTax,
Total.SumNetTotal
FROM (
SELECT CustomerID,
[Service],
[Cash] Cash,
[Check] [Check],
[Credit] Credit,
[Remote] [Remote]
FROM (
SELECT CustomerID,
[Service],
TransType,
SubTotal
FROM @Table
) sub
PIVOT
(
SUM(SubTotal)
FOR [TransType] IN ([Cash],[Check],[Credit],[Remote])
) pvt
) Pivots INNER JOIN
(
SELECT CustomerID,
[Service],
SUM(SubTotal) SumSubTotal,
SUM(Tax) SumTax,
SUM(NetTotal) SumNetTotal
FROM @Table
GROUP BY CustomerID,
[Service]
) Total ON Pivots.CustomerID = Total.CustomerID
AND Pivots.[Service] = Total.[Service]
这可以在没有枢轴的情况下完成:
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,它会变得相当复杂。我能想到的最简单的方法是在不同的查询中计算小计、税和净额,然后将查询与联接结合起来。下面的例子;为了简化查询,我放弃了现金和支票
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]
谢谢你,安多玛!我限制自己使用PIVOT,并监督了一个更简单的解决方案,比如您给我的解决方案。我感谢你的帮助!谢谢阿斯坦德。我把另一个答案标为正确,因为它用一种简单得多的方法解决了问题。不过我非常感谢你的回答。