对于每个用户,我想生成聚合结果。但是,我一直在遇到子查询返回1个以上结果的问题。
SELECT **[user]**,
((SELECT SUM(amount)
FROM transactions
WHERE [user] = **[user]**
AND [type] = 'credit' ) -
(SELECT SUM(amount)
FROM transactions
WHERE [user] = **[user]**
AND [type] = 'debit' ))
FROM transactions
如何从开头的user
获取select
,然后在子查询中作为变量user
运行?
答案 0 :(得分:3)
使用CASE
来简化求和:
SELECT user,SUM(CASE type WHEN 'credit' THEN amount WHEN 'debit' THEN -amount END)
from transactions
GROUP BY user
如果信用卡和借记卡是唯一有效的类型,则可以进一步简化为:
CASE type WHEN 'credit' THEN amount ELSE -amount END
使用子查询进行求和活动的答案,同时仍然从事务表中选择用户将多次执行求和 - 对于事务表中的每一行执行一次 - 因此,如果一个用户有5个事务,则他们将计算总和5次(并显示5个结果行),我认为你不想要。
答案 1 :(得分:2)
select username,
SUM(amount * case when operation = 'credit' then 1 else -1 end) as balance
from #transaction
group by username
答案 2 :(得分:1)
试试这个:
SELECT user,
(SELECT SUM(amount)
FROM transactions
WHERE [user] = t.User
AND [type] = 'credit')
-
(SELECT SUM(amount)
FROM transactions
WHERE [user] = t.User
AND [type] = 'debit' ))
FROM transactions t
或者这个:
SELECT user,
Sum (Case type When 'credit' then Amount End) credit,
Sum (Case type When 'debit' then Amount End) debit,
Sum (Case type When 'credit' then Amount
When 'debit' then -Amount End) NetAmount
FROM transactions t
Group By User
答案 3 :(得分:1)
我喜欢@Rubens的答案,但是......
您的数据结构可能会使用一些工作。
实际上为每笔交易存储“信用”或“借记”一词,更不用说用case语句对其进行评估,以便将其转换为可用值(1或-1)是非常昂贵的。
如果您的交易表跟踪数量,那么您可以使用它而不是存储和评估“信用”和“借记”。正数量(例如,我买了2个耙子等);和Netagive数量(例如,-1 rake,这意味着您返回或获得其中一个佣金的信用)可以在不执行任何案例陈述评估的情况下求和。
答案 4 :(得分:0)
也许
SELECT t.user,
((SELECT SUM(amount) FROM transactions WHERE [user] = t.user AND [type] = 'credit' ) -
(SELECT SUM(amount) FROM transactions WHERE [user] = t.user AND [type] = 'debit' ))
FROM transactions t
答案 5 :(得分:0)
@Rubens Farias解决方案的变体:
SELECT
t.[user],
SUM(t.amount * x.factor)
FROM transactions t
INNER JOIN (
SELECT 'credit', 1 UNION ALL
SELECT 'debit', -1
) x (type, factor) ON t.type = x.type
GROUP BY t.[user]