2011-01-14 87 views
3

我有一个表以这种格式条件的总和T-SQL

COL1 COL2 COL3 
A NULL 4 
A NULL 4 
A VAL1 4 
A VAL2 4 
A VAL3 4 
B NULL 5 
B VAL1 6 

我需要带出的输出如下:

COL1 TOTAL VALID 
A 20  12 
B 11  6 

我的问题是,我如何得到“VALID '列 - 只有col2不为null时,它才会执行col3的求和。

我能够正确使用SUM和group by子句来获得'TOTAL'字段。但是,如何计算“有效”列?

任何想法? 非常感谢!

回答

14

事情是这样的:

SELECT col1 
    , SUM(col3) AS TOTAL 
    , SUM(CASE WHEN col2 IS NOT NULL THEN col3 ELSE NULL END) AS VALID 
    FROM mytable 
GROUP BY col1 

的 “绝招” 是使用CASE表达式有条件地返回col3的值。

+0

有多种方式可以返回指定的结果集。这种方法的一大优点是性能;这只使用一次数据。这样可以避免相关子查询(对外部查询返回的每一行都会运行)的开销(请参阅SLak的答案)。它还避免了派生表的开销(即实现内联视图)和联接操作(如Chris Shain的答案中所示,它不能保证得到正确的结果)。 – spencer7593 2013-11-21 01:34:34

0

您可以使用子查询:

SELECT SUM(Col3) AS Total, 
     (SELECT SUM(Filtered.Col3) 
     FROM table Filtered 
     WHERE Filtered.Col1 = Grouped.Col1 
      AND Filtered.Col2 IS NOT NULL 
     ) AS Valid 
FROM table Grouped 
GROUP BY Col1 
-1

这应该工作...

SELECT B.COL1, SUM(A.COL3) AS TOTAL, SUM(B.COL3) AS VALID 
FROM 
(SELECT COL1, COL3 FROM ORIGINAL WHERE COL2 IS NULL) A 
INNER JOIN (SELECT COL1, COL3 FROM ORIGINAL) B ON A.COL1 = B.COL1