tqsl - select查询的结果在子查询中作为变量运行?

时间:2011-07-27 13:37:06

标签: tsql

对于每个用户,我想生成聚合结果。但是,我一直在遇到子查询返回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运行?

6 个答案:

答案 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]