我在表格中有一个对象及其类型表,如下所示:
objectType | object
107 Boeing
107 Airbus
323 Audi
323 Mercedes
323 BMW
985 Ducati
我想计算一个结果表,如下所示,其中为每一行显示groupSizeOfObject列,并表示表中具有与该行中对象相同的objectType的对象数。例如,有三个objectType为323的对象;奥迪,梅赛德斯和宝马,所以这三行中的每一行都应该在groupSizeOfObjectType列中有一个3。
objectType | object | groupSizeOfObjectType
323 Audi 3
323 Mercedes 3
323 BMW 3
107 Boeing 2
107 Airbus 2
985 Ducati 1
使用group by
和count(*)
指令允许我计算以下内容,但是单个对象行已按如下方式分组到一个结果行中:
objectType | object | groupSizeOfObjectType (for clarification, optional)
323 Audi 3
107 Boeing 2
985 Ducati 1
在结果中,我需要拥有所有对象。
我怎样才能做到这一点?
我的实际问题有点复杂。鉴于我有一个带有额外objectKind列的表,如下所示:
objectType | objectKind | object
107 B Boeing
107 B Airbus
323 D Audi
323 D Mercedes
323 D BMW
323 D Lexus
985 B Ducati
我想计算表示objectType和objectKind计数的列,然后先按objectKind排序结果行,然后按降序排列objectTypes,产生以下结果:
objectType | objectKind | object
323 D Audi
323 D Mercedes
323 D BMW
323 D Lexus
107 B Boeing
107 B Airbus
985 B Ducati
答案 0 :(得分:1)
在开始排序行之前,您需要知道每种类型和类型中有多少种。这可以通过在单独的查询中计算这些并将结果连接到原始表来实现。
SELECT o.*
FROM object o
JOIN (
SELECT objectKind, COUNT(*) count
FROM object
GROUP BY objectKind
) ok
ON ok.objectKind = o.objectKind
JOIN (
SELECT objectType, COUNT(*) count
FROM object
GROUP BY objectType
) ot
ON ot.objectType= o.objectType
ORDER BY ok.count DESC, ot.count DESC, o.object ASC
答案 1 :(得分:1)
您可以在派生表中计算计数(请参阅其他答案)或使用标量子查询(fiddle):
SELECT o.*,
( SELECT COUNT(*)
FROM object as ok
WHERE ok.objectKind = o.objectKind
) as kind_cnt,
( SELECT COUNT(*)
FROM object as to
WHERE ot.objectType= o.objectType
) as type_cnt
FROM object o
ORDER BY kind_cnt DESC, type_cnt DESC;
如果您不需要显示计数:
SELECT *
FROM object o
ORDER BY
( SELECT COUNT(*)
FROM object as ok
WHERE ok.objectKind = o.objectKind
) DESC,
( SELECT COUNT(*)
FROM object as ot
WHERE ot.objectType= o.objectType
) DESC