2017-12-09 4 views
0

カテゴリー、収益、トップブランド、トップブランドの収益、セカンドブランド、セカンドブランドの収益などを、5 +以上、一気にすべてのカテゴリに戻したいと考えています。今すぐ各ブランドの行があります各カテゴリのカテゴリ、収益、トップブランド、および収益を1行に戻すにはどうすればよいですか?

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 

ランクごとに1つの行ではなく1つの行を作成するにはどうすればよいですか?

+1

サンプルデータを提供しません。なぜあなたは答えがありません**、しかし**私はあなたが[このブログ]を読むことをお勧めします(http://sqlblog.com/blogs/maria_zakourdaev/archive/2017/11/07/dynamic-pivot-あなたが自分自身の責任を負うことを期待しています。 –

答えて

0

これはあなたの期待をすべて満たしていない可能性があります。私は赤方偏移にアクセスできないため、テストはできません。 redshiftは["動的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]を許可していないようです。つまり、 "動的見出し"(つまり、brand-rank-1 | brand-rank-2 | brand-rank-3 |などの見出し)を得ることはできません。

これを念頭において、ピボットを達成するための方法は、「条件付き凝集体」(集約関数内側ケース式)を使用することであった。

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 

注ランク()は数字のギャップを生成することができ、および/または「等しいランク」の値を持つことができるので、私は変更しましたrow_number()を使用する代わりに、常に5行1〜5を返します。

関連する問題