2015-09-07 56 views
0

我有對象和它們的類型的表中的表如下一列相同的值的數目:SQL:按無聚集/收縮

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首先命令產生的行,然後對象類型,無論是在降序排列產生以下結果:

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

您正在使用什麼數據庫? SQLite或MySQL? –

+0

提高問題的可讀性和說明,以便更好地解釋這個問題和期望的結果 – o0rebelious0o

回答

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

可以計算無論是在派生表(見其他答案),或使用標量子查詢計數(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