2016-03-16 68 views
0

我有一个查询已经摆动了与交易数据有关的数据。我有一张包含客户号码,交易类型和交易金额的表格。SQL查询中的第二个数据透视表

我最初的查询返回了每个客户按事务类型分解的事务总数。它是如下:

;WITH query AS 
(
SELECT customernum,[Cash],[Card] 
FROM (
transactions 
) 
AS source 
PIVOT 
(
COUNT(TransType) FOR TransType IN ([Cash],[Card]) 
) 
AS pvt 
) SELECT customernum AS 'Customer Number', SUM([Cash]) AS 'Cash Transactions', 
SUM([Card]) AS 'Card Transactions' FROM query 
GROUP BY customernum 
ORDER BY customernum 

我现在需要将总值添加到查询,但仍按事务类型细分。

例如,从表 '交易' 的样本数据是:

 
╔═════════════╦═══════════╦════════╗ 
║ CustomerNum ║ TransType ║ Amount ║ 
╠═════════════╬═══════════╬════════╣ 
║   111 ║ Cash  ║  5 ║ 
║   111 ║ Card  ║  5 ║ 
║   111 ║ Cash  ║  5 ║ 
║   111 ║ Cash  ║  5 ║ 
║   111 ║ Card  ║  5 ║ 
║   222 ║ Card  ║  5 ║ 
║   222 ║ Cash  ║  5 ║ 
║   222 ║ Card  ║  5 ║ 
║   333 ║ Cash  ║  5 ║ 
║   333 ║ Cash  ║  5 ║ 
║   333 ║ Cash  ║  5 ║ 
╚═════════════╩═══════════╩════════╝ 

我原来的查询是产生这样的结果:

 
╔═════════════╦══════╦══════╗ 
║ CustomerNum ║ Cash ║ Card ║ 
╠═════════════╬══════╬══════╣ 
║   111 ║ 3 ║ 2 ║ 
║   222 ║ 1 ║ 2 ║ 
║   333 ║ 3 ║ 0 ║ 
╚═════════════╩══════╩══════╝ 

我现在就需要回到这样的:

 
╔═════════════╦══════╦═════════════╦══════╦═════════════╗ 
║ CustomerNum ║ Cash ║ Cash Amount ║ Card ║ Card Amount ║ 
╠═════════════╬══════╬═════════════╬══════╬═════════════╣ 
║   111 ║ 3 ║   15 ║ 2 ║   10 ║ 
║   222 ║ 1 ║   5 ║ 2 ║   10 ║ 
║   333 ║ 3 ║   15 ║ 0 ║   0 ║ 
╚═════════════╩══════╩═════════════╩══════╩═════════════╝ 

回答

2

只需使用条件聚合:

SELECT CustomerNum, 
     SUM(CASE WHEN TransType = 'Cash' THEN 1 ELSE 0 END) AS cash, 
     SUM(CASE WHEN TransType = 'Cash' THEN amount ELSE 0 END) AS cash_amount, 
     SUM(CASE WHEN TransType = 'Card' THEN 1 ELSE 0 END) AS card, 
     SUM(CASE WHEN TransType = 'Card' THEN amount ELSE 0 END) AS card_amount 
FROM transactions 
GROUP BY CustomerNum; 
0

考虑使用两个枢查询作为派生表:

SELECT t1.customernum, t1.Cash, t2.Cash As [Cash Amount], 
     t1.Card, t2.Card As [Card Amount] 

FROM 

    (SELECT * FROM 
     (SELECT customernum, TransType 
      FROM transactions) AS src1 
    PIVOT 
    (
     COUNT(TransType) FOR TransType IN ([Cash],[Card]) 
    ) 
    AS pvt1) As t1 

INNER JOIN 

    (SELECT * FROM 
     (SELECT customernum, TransType, Amount 
     FROM transactions) AS src2 
    PIVOT 
    (
    SUM(Amount) FOR TransType IN ([Cash],[Card]) 
    ) 
    AS pvt2) As t2 

ON t1.customernum = t2.customernum 

SQLFiddle