Sql server SQL从同一个表中选择多个
我有一个包含三列的事务表:transactionType、amount和transactionTimestamp。transactionType列接受1(现金)、2(支票)或3(信用卡)的值 我需要显示每天每个交易类型的总金额。我可以使用针对每个transactionType的单独查询轻松完成此操作: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
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而不是金额。我在这里找到了一个答案:但我想确定。是的,这很好地解释了它:)@阿利库斯