2017-06-05 10 views
0

Ich versuche, Daten nach Unterkategorie zu aggregieren, aber ich brauche sie auf der Grundlage der Gesamtzahl der Kategorien in absteigender Reihenfolge geordnet werden?Aggregieren nach Unterkategorie, dann nach Kategorie sortieren in SQL

Zum Beispiel meine Spaltenüberschriften sind:

tbl (table name) 
singularity_id (key) 
product_cat (category) 
consumption_location (sub-category) 

My SQL-Abfrage ist:

SELECT 
    product_cat, consumption_location, COUNT(DISTINCT singularity_id) as count 
FROM 
    tbl 
GROUP BY 
    product_cat, consumption_location 
ORDER BY 
    product_cat, consumption_location, count DESC; 

Diese Gruppen product_cat und consumption_location aber bestellen nicht durch product_cat Zahl ab.

So sieht meine Daten zur Zeit wie diese, basierend auf meine Frage:

product_cat | consumption_location | count 
------------+----------------------+-------- 
Fruit Juice | Store    | 200 
Fruit Juice | Home     | 600 
Soft Drink | Store    | 1200 
Soft Drink | Home     | 100 
Water  | Store    | 400 
Water  | Home     | 500 

Was ich will, ist:

product_cat | consumption_location | count 
------------+----------------------+-------- 
Soft Drink | Store    | 1200 
Soft Drink | Home     | 100 
Water  | Store    | 400 
Water  | Home     | 500 
Fruit Juice | Store    | 200 
Fruit Juice | Home     | 600 

Seit Softdrink sich die Gesamt-Einträge, gefolgt von Wasser, dann Fruchtsaft.

+0

Können Sie uns Ihre erwartete Leistung mit der Bestellung zeigen, die Sie erwarten ? –

+0

Die Anzahl, auf die Sie verweisen, ist eine Zählung der singularity_id, nicht count von product_cat. Versuchen Sie, eine weitere Zählspalte in der SELECT-Anweisung wie COUNT (product_cat) als count2 hinzuzufügen und dann count2 zur order by-Klausel hinzuzufügen. lass mich wissen, was passiert – Yoav24

+0

@TimBiegeleisen So sieht meine Daten derzeit, basierend auf meiner Abfrage: product_cat | Verbrauchsort | Anzahl ----- | ----- | ----- Fruchtsaft | Laden | 200 Fruchtsaft | Startseite | 600 Erfrischungsgetränk | Laden | 1200 Erfrischungsgetränk | Startseite | 100 Wasser | Laden | 400 Wasser | Startseite | 500 Was ich will ist: product_cat | Verbrauchsort | Anzahl ----- | ----- | ----- Erfrischungsgetränk | Laden | 1200 Erfrischungsgetränk | Startseite | 100 Wasser | Laden | 400 Wasser | Startseite | 500 Fruchtsaft | Laden | 200 Fruchtsaft | Startseite | 600 Da Soft Drink die meisten Einträge hat, gefolgt von Wasser, dann Fruchtsaft. – Jan

Antwort

0
with temptbl as 
    (select distinct product_cat, consumption_location, 
     count(SINGULARITY_ID) over (partition by product_cat) cntcat , 
     count(SINGULARITY_ID) over (partition by 
     product_cat,consumption_location) as cntsub 
    from t2 order by cntcat desc 
    ) 
select product_cat ,consumption_location , cntsub from temptbl ; 
0

Ohne eine temporäre Tabelle, die Sie in einer Zählung für die Partition durch eine „total“

SELECT 
product_cat, consumption_location, COUNT(DISTINCT singularity_id) as count, 
count(*) over (partition by product_cat) as total 
FROM 
tbl 
GROUP BY 
product_cat, consumption_location 
ORDER BY 
total Desc, product_cat, consumption_location 

aber Sie können den Gesamt auslassen aus der select-Anweisung und fügen Sie ihn in der hinzufügen bestellen durch, da es ein Aggregat

SELECT 
product_cat, consumption_location, COUNT(DISTINCT singularity_id) as count 
FROM 
tbl 
GROUP BY 
product_cat, consumption_location 
ORDER BY 
count(*) over (partition by product_cat) Desc, consumption_location 

ist das sollten Sie bekommen, was Sie in Ihrer Probe benötigen, obwohl ich nicht sicher bin, warum Sie den Laden an der Spitze immer haben. Also ich bestelle es nur durch diese beiden die anderen Felder scheinen nicht in Ihrem Beispiel nur die endgültige Summe dann consumption_location scheint aufsteigend nach der Gesamtsumme zu sein

Verwandte Themen