Sql server SQL从同一个表中选择多个

Sql server SQL从同一个表中选择多个,sql-server,Sql Server,我有一个包含三列的事务表:transactionType、amount和transactionTimestamp。transactionType列接受1(现金)、2(支票)或3(信用卡)的值 我需要显示每天每个交易类型的总金额。我可以使用针对每个transactionType的单独查询轻松完成此操作: SELECT SUM(amount) AS cashTotal, dateadd(DAY, 0, datediff(DAY, 0, transactionTimestamp)) AS tr

我有一个包含三列的事务表:transactionType、amount和transactionTimestamp。transactionType列接受1(现金)、2(支票)或3(信用卡)的值

我需要显示每天每个交易类型的总金额。我可以使用针对每个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));
但这只会导致“子查询返回的值超过1”错误。我觉得无论如何都不应该这样做。谢谢你的建议

编辑:我应该澄清一下,我试图输出如下结果:

----------------------------------------------------
cashTotal | checkTotal | cardTotal | transactionDay
----------------------------------------------------
1000      | 1000        | 1000      | date
0         | 500         | 0         | date
----------------------------------------------------
每行显示特定日期每个交易类型的总金额


编辑:编辑某些详细信息以删除敏感信息。

那么您也希望简单地按付款类型分组吗

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

您可以添加一个
orderby
来按您想要的顺序获取项目(按类型,然后按日期,反之亦然)

那么您还想按付款类型分组吗

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

您可以添加一个
orderby
来按您想要的顺序获取项目(按类型,然后按日期,反之亦然)

您可以使用条件聚合。此外,您还可以转换为
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);

您可以使用条件聚合。此外,您还可以转换为
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);

在您的方法中,最后一行
“按日期分组添加(DAY,0,datediff(DAY,0,transactionTimestamp));
我想不是必需的

看起来你只需要按照PaymentType和Transaction day进行分组

按付款类型、交易日从PaymentRecords组中选择金额(amnt)、付款类型、交易日


注意:根据您的需要设置transactionDay的格式。

在您的方法中最后一行
“按日期分组添加(DAY,0,datediff(DAY,0,transactionTimestamp))不是必需的

看起来你只需要按PaymentType和Transaction day进行分组。。差不多

按付款类型、交易日从PaymentRecords组中选择金额(amnt)、付款类型、交易日


注意:根据您的需要设置transactionDay的格式。

只需将条件聚合与
大小写表达式一起使用即可:

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))
你的意思是延长约会时间吗?如果是,则替换为:

CAST(transactionTimestamp as DATE)

只需将条件聚合与
大小写表达式一起使用

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))
你的意思是延长约会时间吗?如果是,则替换为:

CAST(transactionTimestamp as DATE)

为什么不使用<代码>案例..当<代码>时?您正在寻找<代码>联盟<代码>?敬请不要破坏或污损您的帖子。为什么不使用<代码>案例..当<代码>时?您正在寻找<代码>联盟<代码>?敬请不要破坏或污损您的帖子。嗨,谢谢您的建议,但我很想知道如何到达其他0,谢谢。对不起,我的意思是,在什么情况下,总和使用0而不是数量。我在这里找到了一个答案:但我想确定。是的,这很好地解释了它:)@AlycusHi,谢谢你的建议,但我很想知道如何到达其他0,谢谢。对不起,我的意思是,在什么情况下总和使用0而不是金额。我在这里找到了一个答案:但我想确定。是的,这很好地解释了它:)@阿利库斯