SQL复杂计数

时间:2016-03-04 20:07:43

标签: sql oracle count group-by

我希望从表格中获取所有可能的type,然后count group拥有此type的行。

为了更好地说明,请考虑下表。

对象(o)

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的行。我也想把它包括在内。

3 个答案:

答案 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