T-SQL递归

T-SQL递归,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,我有一组如下所示的数据 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

我有一组如下所示的数据

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

从您的示例中,您不需要嵌套查询、任何递归等

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

您是否在实际代码中使用关键字作为列名?我看到了精选组,感到困惑。一组一组的让人困惑。刚才,我做的是创建了一个临时表,然后先选择所有数据,然后左键加入临时表。。它确实解决了这个问题,但我觉得它有点站不住脚..1=1的目的是什么?@goatco-从OPs代码复制而来。我猜这是为了使构建动态where子句更容易。我的示例是我的错,而不是我的错,我忘了在示例中显示,在我可以取消之前,我需要验证模式和控件,例如如果模式=1和控件=1,那么它就被取消了。。那么你能告诉我怎么做吗?@paulpolo-你的意思是你没有一个取消字段,但是如果模式>0,控制>0,一行应该被视为取消?您在注释中说=1,但在数据中有一行control=7,但您将其视为已取消?