Tsql tqsl-选择查询的结果是否作为子查询中的变量进行操作?

Tsql tqsl-选择查询的结果是否作为子查询中的变量进行操作?,tsql,Tsql,对于每个用户,我希望生成一个聚合结果。但是,我一直遇到子查询返回多个结果的问题 选择**[用户]**, 选择SUMamount 来自交易 其中[user]=***[user]** 和[类型]=“信用”—— 选择SUMamount 来自交易 其中[user]=***[user]** 和[类型]=“借方” 来自交易 如何从开始时的select中获取用户,然后作为子查询中的变量用户进行操作? SELECT t.user, ((SELECT SUM(amount) FROM transactions

对于每个用户,我希望生成一个聚合结果。但是,我一直遇到子查询返回多个结果的问题

选择**[用户]**, 选择SUMamount 来自交易 其中[user]=***[user]** 和[类型]=“信用”—— 选择SUMamount 来自交易 其中[user]=***[user]** 和[类型]=“借方” 来自交易 如何从开始时的select中获取用户,然后作为子查询中的变量用户进行操作?

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。