我有一张桌子:
[letter] [Name] [status] [price]
A row1 1 11
A row1 1 15
B row2 2 9
B row2 3 23
B row2 3 30
想要选择这样的数据:
SELECT letter, Name,
COUNT(*),
CASE WHEN price>10 THEN COUNT(*) ELSE NULL END
GROUP BY letter, Name
结果是:
A row1 2 2
B row2 1 null
B row2 2 2
但我想要这种格式:
A row1 2 2
B row2 3 2
请帮我修改我的查询
答案 0 :(得分:6)
关闭。可能想要这个:
SELECT letter, Name,
COUNT(*),
SUM(CASE WHEN price>10 THEN 1 ELSE 0 END)
FROM TableThatShouldHaveAppearedInTheQuestionInTheFromClause
GROUP BY letter, Name
应该有效。假设第四列的意图是返回每组内行数的计数,price
大于10
。也可以COUNT()
对CASE
执行此操作,然后返回非NULL
和NULL
结果,以查找应该和不应该计算的行数,但我发现上面的表格更容易快速推理。
答案 1 :(得分:1)
由于在聚合函数中不使用空值:
SELECT letter
, name
, count(*)
, count(
case when price > 10 then 1
end
)
FROM t
GROUP BY letter, name
你非常接近。
答案 2 :(得分:0)
看看其他答案,可能这不是最好的方法,但它会起作用。
超过10的价格计数是使用子查询进行的,该子查询的条件为price > 10
,并且已加入当前TAB
条记录,并且别名为A
letter
}和name
。
SELECT letter,
Name,
COUNT(*),
(SELECT COUNT(*) FROM TAB WHERE letter = A.letter and Name = A.Name WHERE price>10)
FROM TAB A
GROUP BY letter, Name