2013-07-11 121 views
1

我有一组数据,看起来像下面T-SQL递归

Name Time Perc Group Mode Control Cancelled 
A  10:52 10.10 10  0  1   0 
B  09:00 10.23 10  1  1   1 
C  12:02 12.01 12  0  1   1 
D  10:45 12.12 12  1  7   1 
E  12:54 12.56 12  1  3   0 
F  01:01 13.90 13  0  11  1 
G  02:45 13.23 13  1  12  1 
H  09:10 13.21 13  1  1   0 

我需要象下面的输出;

Group Perc Cancelled 
10 20.33  1 
12 36.69  2 
13 40.34  2 

我得到的是类似的东西;

Group Perc Cancelled 
10 20.33  5 
12 36.69  5 
13 40.34  5 

我不知道什么叫这个,我在我的脑海东西,这样称呼它CTE?,但我真的无法弄清楚。

这是我的资料来源;

SELECT Group, SUM(Perc), Cancelled FROM 
(SELECT Group, Perc, (SELECT COUNT(*) FROM tblName WHERE Cancelled=1) AS Cancelled FROM tblName WHERE 1=1 AND Group>=10)dt 
GROUP BY Group, Cancelled 
+2

您是否在实际代码中使用关键字作为列名称?我看到“SELECT Group”并且感到困惑。 “GROUP BY Group”令人眼花缭乱。 – Zec

+0

刚才,我做的是我创建了一个#temp表,然后选择所有的数据,然后左加入#temp表..它确实解决了这个问题,但我觉得它有点蹩脚.. –

回答

3

从你的榜样,你不需要嵌套查询,任何递归,等等...

SELECT 
    Group, 
    SUM(Perc)  AS total_perc, 
    SUM(cancelled) AS total_cancelled 
FROM 
    tblName 
WHERE 
    1=1 
    AND Group >= 10 
GROUP BY 
    Group 

如果你确实有一些不同的数据,那么你可能想使用类似...

SUM(CASE WHEN cancelled > 0 THEN 1 ELSE 0 END) AS total_cancelled 
+0

什么是在那里有'1 = 1'的目的? –

+0

@goatco - 从OPs代码复制。猜测这是为了更容易地构建动态where子句。 – MatBailie

+0

我的例子是怪,谁让它是没有其他的我,我忘了在示例中显示,我可以取消之前我需要验证的模式和控制,如模式= 1和控制= 1,那么它被取消了..所以你能告诉我怎么样? –