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,并监督了一个更简单的解决方案,比如您给我的解决方案。我感谢你的帮助!谢谢阿斯坦德。我把另一个答案标为正确,因为它用一种简单得多的方法解决了问题。不过我非常感谢你的回答。