2016-06-14 73 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。