2016-06-14 51 views
-1

我有一個交易表,其中包含三列:transactionType,amount和transactionTimestamp。 transactionType列接受1(現金),2(支票)或3(信用卡)的值。SQL從同一個表中選擇多個

我需要顯示每個transactionType每天的總金額。我可以爲每個TRANSACTIONTYPE很容易地做到這一點使用單獨的查詢:

SELECT SUM(amount) AS cashTotal, dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp)) AS transactionDay 
    FROM TransactionRecords 
    WHERE transactionType = 1 
    GROUP BY dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp)); 

    SELECT SUM(amount) AS checkTotal, dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp)) AS transactionDay 
    FROM TransactionRecords 
    WHERE transactionType = 2 
    GROUP BY dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp)); 

    SELECT SUM(amount) AS cardTotal, dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp)) AS transactionDay 
    FROM TransactionRecords 
    WHERE transactionType = 3 
    GROUP BY dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp)); 

但我需要做的是做一個查詢。我已經嘗試將上面的代碼合併爲一個,如下所示:

SELECT 
     (SELECT SUM(amount) FROM TransactionRecords WHERE transactionType = 1 GROUP BY dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp))) AS cashTotal, 
     (SELECT SUM(amount) FROM TransactionRecords WHERE transactionType = 2 GROUP BY dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp))) AS checkTotal, 
     (SELECT SUM(amount) FROM TransactionRecords WHERE transactionType = 3 GROUP BY dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp))) AS cardTotal, 
     dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp)) AS transactionDay 
    FROM TransactionRecords 
    GROUP BY dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp)); 

但是,這隻會導致「子查詢返回多個值」錯誤。而我的感覺並不是它應該怎麼做。感謝您的任何建議。

編輯:我要澄清一點,我試圖輸出結果如下所示:

---------------------------------------------------- 
cashTotal | checkTotal | cardTotal | transactionDay 
---------------------------------------------------- 
1000  | 1000  | 1000  | date 
0   | 500   | 0   | date 
---------------------------------------------------- 

每行顯示每個TRANSACTIONTYPE該日期的總量。

編輯:一些細節編輯刪除敏感信息。

+1

爲什麼不使用'CASE..WHEN'? – MusicLovingIndianGirl

+0

你在找'UNION'嗎? – jleach

+1

請勿肆意破壞或污損你的帖子。 –

回答

1

只要使用條件聚合,CASE EXPRESSION

SELECT 
     SUM(CASE WHEN paymentType = 1 THEN amount ELSE 0 END) as cashTotal, 
     SUM(CASE WHEN paymentType = 2 THEN amount ELSE 0 END) as chequeTotal, 
     SUM(CASE WHEN paymentType = 3 THEN amount ELSE 0 END) as cardTotal, 
     dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp)) AS transactionDay 
    FROM PaymentRecords 
    GROUP BY dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp)); 

雖然此行似乎不可思議

dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp)) 

您的意思是TRUNC日期時間?如果這樣替換爲:

CAST(transactionTimestamp as DATE) 
+0

嗨,謝謝你的建議,但我很想知道如何去ELSE 0,謝謝。 – Alycus

+0

你是什麼意思? – sagi

+0

對不起,我的意思是SUM在什麼情況下使用0而不是數量。我在這裏找到了答案:http://dba.stackexchange。com/questions/120003/what-does-then-1-else-0-mean-in-case-expression-used-an-aggregate-functio但我想確定。 – Alycus

1

所以,你想最高層簡單地通過paymentType進行分組?

SELECT SUM(amount) AS cashTotal 
    , paymentType 
    , dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp)) AS transactionDay 
FROM PaymentRecords 
GROUP BY paymentType 
     , dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp)); 

您可以添加ORDER BY得到你想要的順序選擇項目(按類型,然後日期,或反之亦然)

1

可以使用條件聚集。此外,還可以轉換爲date刪除日期的時間部分:

SELECT SUM(CASE WHEN transactionType = 1 THEN amount ELSE 0 END) as cashTotal, 
     SUM(CASE WHEN transactionType = 2 THEN amount ELSE 0 END) as checkTotal, 
     SUM(CASE WHEN transactionType = 3 THEN amount ELSE 0 END) as cardTotal, 
     CAST(transactionTimestamp as DATE) as TransactionDay 
FROM TransactionRecords 
GROUP BY CAST(transactionTimestamp as DATE) 
ORDER BY CAST(transactionTimestamp as DATE); 
0

在你的方法,最後一行"GROUP BY dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp));不需要我想..

也像你只需要GROUP BY Paymentype和transcation天..像

Select sum(amnt),payment_type,transactionDay from PaymentRecords group by payment_type,transactionDay

注:根據烏拉圭回合的需要格式化transactionDay。