我希望从表格中获取所有可能的type
,然后count
group
拥有此type
的行。
为了更好地说明,请考虑下表。
id name group_id type
-----------------------------------------------------------
1 Computer 100 A
2 Monitor 100 A
3 Chair 100 B
4 Table 100 B
5 Telephone 100 C
6 Notebook 200 D
7 Pen 200 D
8 Wire 100 E
我想得到的是以下结果:
group_id type total
-------------------------------
100 A 2
100 B 2
100 C 1
100 D 0
100 E 1
group_id
不必包含在结果中,我只是想让你看到我在查询中使用WHERE
子句。基本上我只想要group | 100
的结果,但我想要所有type
的计数。
使用我的查询
SELECT o.group_id, o.type, COUNT(*) AS total
FROM object o
WHERE o.group_id = 100
GROUP BY o.type
我只得到以下结果:
group_id type total
-------------------------------
100 A 2
100 B 2
100 C 1
100 E 1
您会注意到我错过了type | D
的行。我也想把它包括在内。
答案 0 :(得分:3)
您可以使用以下查询:
SELECT 100 AS group_id,
o.type,
COUNT(CASE WHEN o.group_id = 100 THEN 1 END) AS total
FROM object o
GROUP BY o.type
此查询按type
分组,并使用条件聚合,以便计算每个组type = 100
下的行。
答案 1 :(得分:1)
问题是在该ID的查询中未返回类型D,因此它不包含在分组中。为此,我们需要获取表中所有类型的列表,然后在表中对您的ID进行计数。像这样:
SELECT o_list.type, COUNT(o.id) AS total
FROM object o
RIGHT OUTER JOIN ( SELECT DISTINCT type from object ) o_list on o_list.type = o.type
WHERE o.group_id = 100
GROUP BY o_list.type
可以说,Giorgos的版本更清晰易读,并且总是在一次完整的扫描中运行。 Mine更复杂,但如果group_id和type上有索引,则会在索引扫描上运行,因此在大型数据集上可能会明显加快。
你会发现总会有如何解决问题的方法。 :)
答案 2 :(得分:0)
由于Type 100不是100组,我首先得到一组不同的类型,然后再加入到对象中,因为你想要100代表D类,当类型不存在时我总是显示100。 / p>
SELECT coalesce(O.Group_ID,100) as Group_ID, T.Type, count(O.Group_ID) as Total
FROM (Select Distinct Type from object) T
LEFT JOIN Object O
on T.Type = O.Type
GROUP BY coalesce(O.Group_ID,100), T.Type