我正在SQL Server 2008上开发一个小的存储过程。我对SQL查询知之甚少,但足以完成简单的任务。但是我想出了一个我无法解决的问题。在我开始解释我的问题之前,请原谅我,如果我拼错SQL查询字,因为我不是母语为英语的人。
我有4个字段(CSV表示):
ID, NAME, VALUES, ANSWER
25, Tom , 2400 , 0
25, Tom , 600 , 0
25, Tom , 500 , 1
25, Tom , 300 , 1
27, Jerry, 100, 0
27, Jerry, 20, 1
27, Jerry, 60, 1
27, Jerry, 2000, 0
我想要做的是按照ID
和NAME
的选择进行分组,在名为positive when ANSWER = 1
和negative when ANSWER = 0
的字段中汇总它的值。
ID, NAME, SUM, NEGATIVE, POSITIVE
25, Tom, 3000, 800
27, Jerry, 2100, 80
我猜我的问题已被问过几次,但我无法找到任何关于它的信息,可能是因为我使用了错误的条款。无论如何,如果有人可以提供帮助,那将节省我很多时间。
答案 0 :(得分:4)
您将使用CASE声明进行此操作。
select Id
, Name
, SUM(case when answer = 1 then Values else 0 end) as Positive
, SUM(case when answer = 0 then Values else 0 end) as Negative
from MyTable
group by Id
, Name
答案 1 :(得分:2)
使用以下列重写SQL:
sum(case when answer=0 then values else 0 end) negative
答案 2 :(得分:1)
Ephismen,
您提供的示例中存在隐藏的问题。你总是至少有一个正面和一个负面吗?如果你只有一个或另一个而不是两者,你想要发生什么?当每个id和名称有多行时,将表连接到自身将不起作用。
两个单独查询的UNION将能够回答这些问题,但不确定它是否适用于SQL Server 2008.
您可以通过对SQL使用group by子句来实现此目的:
select id
, name
, sum (neg_values) as negative
, sum (pos_values) as positive
from -- temporary table
( select id
, name
, sum (values) as neg_values
, 0 as pos_values -- placeholder
from mytable
where answer = 0 -- negative
group by id
, name
union all
select id
, name
, 0 as neg_values -- placeholder
, sum (values) as pos_values
from mytable
where answer = 1 -- positive
group by id
, name
)
group by id
, name
临时表(带联合的内部选择)将返回与此类似的行:
id name neg_value pos_value
25 tom 3000 0
25 tom 0 800
27 jerry 2100 0
27 jerry 0 80
最终选择将返回您想要的结果(将它们加在一起)。