我不太清楚如何描述标题问题,但这是我的问题。
我有一个名为hello
的表,其中有两列名为time
和state
。
Time | State
这是我拥有的数据的一个例子
1 DC
1 VA
1 VA
2 DC
2 MD
3 MD
3 MD
3 VA
3 DC
我想得到所有可能的时间和“VA”的数量(如果“VA”当时没有出现,则为0) 输出看起来像这样
Time Number
1 2
2 0
3 1
我试着做
SELECT DISTINCT time,
COUNT(state) as Number
FROM hello
WHERE state = 'VA'
GROUP BY time
但它似乎不起作用。
答案 0 :(得分:2)
这是一个条件聚合:
select time, sum(case when state = 'VA' then 1 else 0 end) as NumVA
from hello
group by time
我想补充一点,当你拥有distinct
时,千万不要使用group by
。这两个是多余的。在SQL语言中甚至不需要Distinct
作为关键字;从语义上讲,它只是所有列分组的简写。
答案 1 :(得分:2)
SELECT TIME,
SUM(CASE WHEN State = 'VA' THEN 1 ELSE 0 END)
FROm tableName
GROUP BY Time
答案 2 :(得分:0)
一条经验法则是先计算你的计数,然后将它们放入临时表中供以后使用。 见下文:
Create table temp(Num int, [state] varchar(2))
Insert into temp(Num,[state])
Select 1,'DC'
UNION ALL
Select 1,'VA'
UNION ALL
Select 1,'VA'
UNION ALL
Select 2,'DC'
UNION ALL
Select 2,'MD'
UNION ALL
Select 3,'MD'
UNION All
Select 3,'MD'
UNION ALL
Select 3,'VA'
UNION ALL
Select 3,'DC'
Select t.Num [Time],t.[State]
, CASE WHEN t.[state] = 'VA' THEN Count(t.[State]) ELSE 0 END [Number]
INTO #temp2
From temp t
Group by t.Num, t.[state]
--drop table #temp2
Select
t2.[time]
,SUM(t2.[Number])
From #temp2 t2
group by t2.[time]