views:

1792

answers:

2

Given the following result set:

---------------------------------------------------------
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
---------------------------------------------------------

Note that NetTotal = SubTotal - Tax

Please help me calculate sum(SubTotal), sum(Tax) and sum(NetTotal), along with pivotted TransType, as follows:

--------------------------------------------------------------------------
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    
--------------------------------------------------------------------------

If I had only 1 column to be summarized it would be straight forward using PIVOT, but I am not sure how to get the 3 aggregates - for SubTotal, Tax and NetTotal.

Thanks for your help!

+1  A: 

Have you tried something like this?

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]
astander
Thanks astander. I marked the other answer as correct because it solved the problem in a much simpler way. I appreciate your answer very much though.
Gustavo Cavalcanti
+1 for the correct answer and the inserts :)
Andomar
+4  A: 

This can be done without a 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]

With PIVOT, it gets considerably more complex. The easiest way I can think of is to calculate SubTotal, Tax, and NetTotal in a different query, and then combine the queries with a join. Example below; to keep the query simple, I've discarded Cash and Check.

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]
Andomar
Thanks Andomar! I was restricting myself to using PIVOT and oversaw a much simpler solution such as the one you gave me. I appreciate your help!
Gustavo Cavalcanti