2012-08-14 59 views
1

我正在使用SQL Server 2008 R2如何创建没有内部子查询的总和列?

我有一个复杂的查询,我需要有一个有条件的总结列。

这里是我的查询和结果的简化版本:

DECLARE @t TABLE (id int, condition int, value int); 

INSERT INTO @t 
VALUES (1,1,12), (2,0,88), (3,1,11) 

SELECT 
    *, 
    (SELECT SUM(value) FROM @t WHERE condition = 1) as SumOfConditionalValues 
FROM @t 

下面是该查询的结果”

id condition value SumOfConditionalValues 
1 1   12  23 
2 0   88  23 
3 1   11  23 

我买不起SumOfConditionalValues子查询

有没有一种优雅的方式来实现没有它的条件求和列?

哪些聚合命令适用于此处(如果有),以及如何应用这些命令?

回答

4

试试这个:

SELECT *, SUM(CASE WHEN condition = 1 THEN value END) OVER() SumOfConditionalValues 
FROM @t 
+0

@bluefeet - 这个答案通过了我所有的测试,即使在真实的数据和复杂的查询中也是如此。我应该寻找什么问题? – elarrow 2012-08-14 15:30:01

+0

@elarrow这个答案没有问题。这个答案解决了问题,而不使用“GROUP BY”。 – Taryn 2012-08-14 15:31:30

+0

@elarrow - 本身不应该有任何问题。也许你应该根据AnandPhadke给出的查询来测试这个查询的性能,看看你的数据集是否有一些不同。 – Lamak 2012-08-14 15:41:03

0

我相信你正在寻找的是“CASE”语句......很强大,例如:

select id, sum(case when condition=1 then value else 0 end) group by id..etc 
+2

这不会给他想要的,因为op需要表中每个记录的总和相同的值。 – Lamak 2012-08-14 14:56:04

0
Declare @sum int 
SELECT @sum=SUM(value) FROM @t WHERE condition = 1 
select *,@sum from yourtable 
+0

声明? ........ – Phil 2012-08-14 15:04:34

+0

你的问题是什么? – AnandPhadke 2012-08-14 15:09:33

0

你可以把结果按条件汇总:

DECLARE @t TABLE (id int, condition int, value int); 
INSERT INTO @t VALUES (1,1,12), (2,0,88), (3,1,11) 
SELECT *, 
sum(value) over (partition by condition) as SumOfConditionalValues 
FROM @t 
1

请参阅:http://sqlfiddle.com/#!3/1abea/1

使用自联接:

CREATE TABLE MyTable (id int, condition int, value int); 

INSERT INTO MyTable 
VALUES (1,1,12), (2,0,88), (3,1,11) 

SELECT 
    MyTable.id, 
    MyTable.Condition, 
    MyTable.value, 
    SUM(JoinedMyTable.Value) 
FROM 
    MyTable 
    LEFT JOIN MyTable JoinedMyTable ON MyTable.condition = JoinedMyTable.Condition 
GROUP BY 
    MyTable.id, 
    MyTable.Condition, 
    MyTable.value 

编辑:不知道,如果你想每一行显示行的总和,其中条件= 1,但是如果你只是改变联接子句是:

LEFT JOIN MyTable JoinedMyTable ON JoinedMyTable.Condition = 1 
0

我想这是你想要的东西:

SELECT id, condition, value, 
     SUM(CASE WHEN condition = 1 THEN value_at_1 END) OVER() SumOfConditionalValues 
FROM (select *, 
      (case when condition = 1 then value end) as value_at_1 
     from @t 
    ) t 

你需要一个“条件v alue“,你可以在子查询中创建它。