MS SQL Studio 2008-使用SUM选择子查询

MS SQL Studio 2008-使用SUM选择子查询,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,使用SUM的此子查询存在问题。查询将汇总特定日期范围内多条记录的利润列。我根据记录中所附的账号对利润总额进行分组。有了一个帐号,它就可以正常工作了: select [ACCOUNT ID], ( select SUM(PROFIT) from [Transaction Table] where [ACCOUNT ID] in ('1001') and [ACTIVITY DATE] in ('5/31/2012') ) as 'Ma

使用SUM的此子查询存在问题。查询将汇总特定日期范围内多条记录的利润列。我根据记录中所附的账号对利润总额进行分组。有了一个帐号,它就可以正常工作了:

select
    [ACCOUNT ID],
    (
     select SUM(PROFIT)
     from [Transaction Table]
     where [ACCOUNT ID] in ('1001')
     and [ACTIVITY DATE] in ('5/31/2012')
    ) as 'May Profit'

from
    [Transaction Table]

where
    [ACCOUNT ID] in ('1001')

group by
    [ACCOUNT ID]    
给出正确的结果:

    | ACCOUNT ID | May Profit |
    ---------------------------
    |    1001    |   $61.97   |
    | ACCOUNT ID | May Profit |
    ---------------------------
    |    1001    |  $127.34   |
    |    2001    |  $127.34   |
问题来自多个帐号:

select
    [ACCOUNT ID],
    (
     select SUM(PROFIT)
     from [Transaction Table]
     where [ACCOUNT ID] in ('1001','2001')
     and [ACTIVITY DATE] in ('5/31/2012')
    ) as 'May Profit'

from
    [Transaction Table]

where
    [ACCOUNT ID] in ('1001','2001')

group by
    [ACCOUNT ID]    
给出了不正确的结果:

    | ACCOUNT ID | May Profit |
    ---------------------------
    |    1001    |   $61.97   |
    | ACCOUNT ID | May Profit |
    ---------------------------
    |    1001    |  $127.34   |
    |    2001    |  $127.34   |
每个记录上的两个账户的“五月利润”合计。我需要每个帐号的个人利润总额


有什么想法吗?提前谢谢

您不需要使用子查询

 select
     [ACCOUNT ID],
     SUM(PROFIT)
 from [Transaction Table]
 where [ACCOUNT ID] in ('1001','2001') and [ACTIVITY DATE] in ('5/31/2012')
 group by [ACCOUNT ID]
您的查询只计算了两个帐户的总和,并在每一行显示它


更新:

实际上,对于多次求和,我会这样做

 select
     [ACCOUNT ID],
     SUM(case when [ACTIVITY DATE] in ('5/31/2012') then PROFIT else 0 end) as 'May Profit',
     SUM(case when [ACTIVITY DATE] in ('4/31/2012') then PROFIT else 0 end) as 'April Profit'
 from [Transaction Table]
 where [ACCOUNT ID] in ('1001','2001') and 
 group by [ACCOUNT ID]

您不需要使用子查询,但以下是两种方法:

第一种方法是使用您的查询(不推荐)-注意帐户Id=T。帐户Id:

select
    [ACCOUNT ID],
    (
     select SUM(PROFIT)
     from [Transaction Table]
     where [ACCOUNT ID] = T.[ACCOUNT ID]
     and [ACTIVITY DATE] in ('5/31/2012')
    ) as 'May Profit'
from
    [Transaction Table] T
where
    [ACCOUNT ID] in ('1001','2001')
group by
    [ACCOUNT ID]  
更好的方法:

select
     [ACCOUNT ID],
     SUM(PROFIT)
from [Transaction Table]
where [ACCOUNT ID] in ('1001','2001') and [ACTIVITY DATE] in ('5/31/2012')
group by [ACCOUNT ID]

你最好的杰森!我没有完全回答我原来的问题。你更清晰的答案对我来说不起作用。我需要在一张电子表格上列出多个月的利润。因此,我使用多个子选择来提取“五月利润”、“六月利润”、“七月利润”等。您能向我解释一下为什么添加
[ACCOUNT ID]=t.[ACCOUNT ID]
会产生差异吗?因为您最初的查询来自[Transaction Table]在子查询之外,即帐户ID所在的位置。因此,您正在将该表的结果中的帐户ID映射到子查询where子句,这使它能够仅查询行中特定ID的结果。您的帐户ID是一个救命稻草!我现在有10个子查询,都是查询不同日期范围的利润栏。非常感谢!这个答案也完全正确。如果您需要在同一个查询中有多个子选择,请参阅Jason Heine的第一个答案。@tcshain为多个子选择添加了建议的语法:)我真的不喜欢子选择,而且它们比只使用聚合进行一次选择要慢如果我正确理解这些聚合,那么您已经在
利润
时执行了
SUM
满足[活动日期]
的要求。您能解释一下
else 0 end
部分在做什么吗?sum是聚合函数,对于每一行,如果('5/31/2012')
中的
[ACTIVITY DATE],则得到一个等于
利润的值,否则为0,然后对值求和