Tsql tqsl-选择查询的结果是否作为子查询中的变量进行操作?
对于每个用户,我希望生成一个聚合结果。但是,我一直遇到子查询返回多个结果的问题 选择**[用户]**, 选择SUMamount 来自交易 其中[user]=***[user]** 和[类型]=“信用”—— 选择SUMamount 来自交易 其中[user]=***[user]** 和[类型]=“借方” 来自交易 如何从开始时的select中获取用户,然后作为子查询中的变量用户进行操作?Tsql tqsl-选择查询的结果是否作为子查询中的变量进行操作?,tsql,Tsql,对于每个用户,我希望生成一个聚合结果。但是,我一直遇到子查询返回多个结果的问题 选择**[用户]**, 选择SUMamount 来自交易 其中[user]=***[user]** 和[类型]=“信用”—— 选择SUMamount 来自交易 其中[user]=***[user]** 和[类型]=“借方” 来自交易 如何从开始时的select中获取用户,然后作为子查询中的变量用户进行操作? SELECT t.user, ((SELECT SUM(amount) FROM transactions
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
试试这个:
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
用于简化求和:
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个结果行,我想您不会想要的。的解决方案的变体:
select username,
SUM(amount * case when operation = 'credit' then 1 else -1 end) as balance
from #transaction
group by username
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]
我喜欢@Rubens的回答,但是 您的数据结构可能需要一些工作 实际上,为每笔交易存储“贷记”或“借记”一词,更不用说为了将其转换为可用值1或-1而必须使用案例陈述对其进行评估,这是非常昂贵的
如果您的交易表记录了数量,那么您就可以使用它来代替存储和评估“贷方”和“借方”。正数量,例如,我买了2个耙子等。;和Netagive数量,例如,-1 rake,这意味着您返回或获得了其中一个rake的积分,可以在不执行任何案例陈述评估的情况下求和。感谢@sll清理代码的演示:感谢@Damien\u不信者!以前我的PHP&TSQL解决方案需要30秒才能完成。。。但现在它已经大幅降低到1秒以下!!!非常感谢你!谢谢查尔斯的想法,但我选择了更简洁的选项:不幸的是@Marc这个选项不起作用。它没有为每个用户提供单一的聚合结果。不管怎样,还是要谢谢你:你需要把名字写在你的专栏里subselect@t-clausen.dk:列的别名在子选择器的别名后面的括号中指定:x type,factor。