2017-01-31 37 views
1

比方说,我有这种表:SQL Server:如何使用where子句在select查询中包含count?

id  out flag 
--- ---  --- 
1  0  1 
1  1  0 
1  4  0 
2  0  1 
2  2  0 
2  2  0 
3  0  1 
3  2  0 
3  1  0 
3  4  0 

我要计数与出的行数=(0,2,或4)和以后的显示行,其中标志= 1

基本上: 选择ID,计数(其中,出IN(0,2,4))作为CNT,其中标志= 1

我所需的输出:

id cnt 
--- ---- 
1  2 
2  3 
3  3 

该查询可以作为离pected但只有当我没有“其中标志= 1”:

select id,sum(case when out in (0,2,4) then 1 else 0 end) over(partition by id) as cnt 
from tablename 

有没有办法对我来说,首先计算的东西总和(),并将其存储在一列,然后再使用过滤掉行where子句?目前发生的情况是行首先被过滤掉,然后计算sum(...)。

我能纠正这种情况吗?

+0

应的输出为ID = 1是2? –

+0

我同意,id = 1应该有一个计数2 – user918967

+0

刚刚更新!对困惑感到抱歉。 – 90abyss

回答

2

您可以使用case表达式仅在ID为out列的指定值时对行进行求和。

select id,sum(case when out in (0,2,4) then 1 else 0 end) as cnt 
from tablename 
group by id 

编辑:要在求和时包含其他列,请使用sum窗口函数。

select * from (select id,flag 
       ,sum(case when out in (0,2,4) then 1 else 0 end) over(partition by id) as cnt 
       --include other columns as required 
       from tablename 
      ) x 
where flag=1 
+0

我得到一个“因为它不是在聚合函数或GROUP BY子句中包含的ID是在选择列表中无效。”错误。我在select语句中有多个列,并且在GROUP BY中包含所有这些列会使其变得非常复杂。有没有一种方法,我可以使用您的查询,而不使用selectby语句中的每一列groupby? – 90abyss

+0

请参阅编辑.... –

+0

这是按预期工作!还有一件事 - 我的查询也有一个where子句,它从表中过滤出结果。有没有办法我可以先找到sum(),然后用where子句过滤行?创建另一个选择查询和内部加入它我唯一的解决方案? – 90abyss

0
select  id,count(*) as cnt 
from  tablename 
where  out in (0,2,4) 
group by id 
0

不要指望为0,2,4 OUT。然后用Inner Join或使用相关子查询过滤它们

模式:

CREATE TABLE #TAB (ID INT, OUT_VALUE INT, FLAG INT) 

INSERT INTO #TAB 
SELECT 1, 0, 1 
UNION ALL 
SELECT 1, 1, 0 
UNION ALL 
SELECT 1, 4, 0 
UNION ALL 
SELECT 2, 0, 1 
UNION ALL 
SELECT 2, 2, 0 
UNION ALL 
SELECT 2, 2, 0 
UNION ALL 
SELECT 3, 0, 1 
UNION ALL 
SELECT 3, 2, 0 
UNION ALL 
SELECT 3, 1, 0 
UNION ALL 
SELECT 3, 4, 0 
UNION ALL 
SELECT 4, 4, 0 

现在不要选择像下面

INNER JOIN

SELECT T1.ID,COUNT(1) C 
FROM #TAB T1 
INNER JOIN 
(
     SELECT DISTINCT ID FROM #TAB WHERE FLAG = 1 
)FLAGS ON T1.ID = FLAGS.ID 
WHERE T1.OUT_VALUE IN (0,2,4) 
GROUP BY T1.ID 

相关撒哈拉查询

SELECT ID, C FROM (
SELECT T1.ID 
,COUNT(1) C 
,(
     SELECT DISTINCT ID 
     FROM #TAB T2 
     WHERE T1.ID = T2.ID 
      AND T2.FLAG = 1 
     ) FLAG 


FROM #TAB T1 WHERE T1.OUT_VALUE IN (0,2,4) 
GROUP BY T1.ID 

)A 
WHERE A.FLAG IS NOT NULL 

其结果将是

+----+---+ 
| ID | C | 
+----+---+ 
| 1 | 2 | 
| 2 | 3 | 
| 3 | 3 | 
+----+---+ 
相关问题