2017-12-09 3 views
0

Ich möchte Kategorie, Umsatz, Top-Marke, Umsatz für die Top-Marke, zweite Marke, Umsatz für die zweite Marke, etc. bis zu 5 +, idealerweise alle in einer Zeile für diese Kategorie. Im Moment habe ich eine Zeile für jeden der Top-MarkenWie kann ich Kategorie, Umsatz, Top-Marken und deren Umsatz für jede Kategorie in einer Zeile zurückgeben?

SELECT 
     cats.category 
     cats.revenue 
     brands.rank 
     brands.brand 
     brands.revenue_brand 
FROM 
     (SELECT 
     category, sum(revenue) as revenue_total 
     FROM sales 
     GROUP BY category 
    ) cats 
JOIN 
     (SELECT 
     category, 
     brand, 
     sum(revenue) as revenue_brand 
     rank() over (PARTITION BY category ORDER BY revenue_brand DESC) as rank 
     FROM sales 
     GROUP BY category, brand 
    ) brands on cats.category = brands.category 
WHERE brands.rank <=5 

Wie kann ich eine Zeile für jede Kategorie statt eine Zeile für jeden Rang schaffen?

+1

Sie liefern keine Beispieldaten ot desir ed Ergebnis, das ist wahrscheinlich, warum Sie keine Antworten haben, ** aber auch ** Ich schlage vor, Sie lesen [dieses Blog] (http://sqlblog.com/blogs/maria_zakourdaev/archive/2017/11/07/dynamic-pivot- in-amazon-redshift-don-t-blame-datenbanken-für-enttäuschend-du-dir-selbst-bedauern-zu-erwarten-zu-viel-von-ihnen.aspx) –

Antwort

0

Dies könnte nicht alle Ihre Erwartungen erfüllen, und da ich keinen Zugriff auf Rotverschiebung habe, kann ich keine Tests durchführen. Es scheint, dass Rotverschiebung nicht für [ „dynamische SQL“ [(http://sqlblog.com/blogs/maria_zakourdaev/archive/2017/11/07/dynamic-pivot-in-amazon-redshift-don-t-blame-databases-for-disappointing-you-blame-yourself-for-expecting-too-much-from-them.aspx) erlaubt, und dies bedeutet, dass Sie einfach nicht „dynamische Überschriften“ bekommen kann (dh eine Überschrift für brand-rank-1 | brand-rank-2 | brand-rank-3 | usw.

In diesem Sinne die „altmodische“ Art und Weise einen Schwenk zu erreichen war „bedingte Aggregate“ (case-Ausdrücke innerhalb Aggregationsfunktionen) zu verwenden.

SELECT 
     cats.category 
     , max(case when rn = 1 then brands.brand end) 
     , max(case when rn = 1 then brands.revenue_brand end) 
     , max(case when rn = 2 then brands.brand end) 
     , max(case when rn = 2 then brands.revenue_brand end) 
     , max(case when rn = 3 then brands.brand end) 
     , max(case when rn = 3 then brands.revenue_brand end) 
     , max(case when rn = 4 then brands.brand end) 
     , max(case when rn = 4 then brands.revenue_brand end) 
     , max(case when rn = 5 then brands.brand end)  
     , max(case when rn = 5 then brands.revenue_brand end) 
     , cats.revenue 
FROM (
     SELECT 
      category 
      , SUM(revenue) AS revenue_total 
     FROM sales 
     GROUP BY 
      category 
) cats 
JOIN (
     SELECT 
      category 
      , brand 
      , SUM(revenue)               AS revenue_brand 
      , ROW_NUMBER() OVER (PARTITION BY category ORDER BY revenue_brand DESC) AS rn 
     FROM sales 
     GROUP BY 
      category 
      , brand 
) brands ON cats.category = brands.category 
WHERE brands.rn <= 5 
group by 
     cats.category 
     , cats.revenue 

Hinweis weil Rang() Lücken in Zahlen erzeugen können und/oder „gleichrangig“ Werte haben, ich geändert stattdessen die Verwendung von row_number(), die immer 5 Zeilen von 1 bis 5 zurückgibt.

Verwandte Themen