SQL:按一列中相同值的数量排序,不进行聚合/收缩

时间:2015-09-07 14:16:03

标签: mysql sql sqlite

我在表格中有一个对象及其类型表,如下所示:

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 bycount(*)指令允许我计算以下内容,但是单个对象行已按如下方式分组到一个结果行中:

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

2 个答案:

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

SQLFiddle Demo

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