waniwanisan
@waniwanisan

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

SQL row_numberで出力したランキングの値を横表示に変換する

解決したいこと

SQLでランキングを正しく横変換したい(postgres)

例)
年別商品売上トップ3をrow_number関数で表示させたがそれを横変換したい
postgres環境

該当するソースコード(横表示したい)

select 
      , case when 年別ランキング = 1
        then 商品名
        end as 一位
      , case when 年別ランキング = 2
        then 商品名
        end as 二位
      , case when 年別ランキング = 3
        then 商品名
        end as 三位
from
(select
    
    , 商品名
    , 売上金額
    , 年別ランキング 
from
    ( 
        select
            extract(year from ph.purchase_datetime) as 
            , item.item_name as 商品名
            , sum(ph.total_amount) as 売上金額
            , row_number() over ( 
                partition by
                    extract(year from ph.purchase_datetime) 
                order by
                    sum(ph.total_amount) desc
            ) as 年別ランキング 
        from
            mst_item item 
            inner join tbl_purchase_history ph 
                on item.item_id = ph.item_id 
        group by
            
            , 商品名
    ) as サブクエリ一回目 ) as サブクエリ二回目

    group by , 一位, 二位, 三位
    --where 一位 is not null and 二位 is not null and 三位 is not null 
    order by 

通常のソースコード)

select
    
    , 商品名
    , 売上金額
    , 年別ランキング 
from
    ( 
        select
            extract(year from purchase_datetime) as 
            , item.item_name as 商品名
            , sum(ph.total_amount) as 売上金額
            , row_number() over ( 
                partition by
                    extract(year from purchase_datetime) 
                order by
                    sum(ph.total_amount) desc
            ) as 年別ランキング 
        from
            mst_item item 
            inner join tbl_purchase_history ph 
                on item.item_id = ph.item_id 
        group by
            
            , 商品名
    ) as サブクエリ名前? 
where
    年別ランキング <= 3 
order by
    , 売上金額 desc


自分で試したこと

横表示したいテーブル
スクリーンショット 2021-06-25 105841.png,

年別に商品名は正しく表示されているがnull表示をもらってしまう
スクリーンショット 2021-06-25 110112.png

0

1Answer

一番外側を、

select 
      , min(case when 年別ランキング = 1 then 商品名 end) as 一位
      , min(case when 年別ランキング = 2 then 商品名 end) as 二位
      , min(case when 年別ランキング = 3 then 商品名 end) as 三位
from (
  /* 内側は同じ */
)
group by 
order by 

としてみるとか。

年別ランキング自体が一意の値なので、minの代わりにmaxでも結果は同じはず。
試してないから、SQLエラー出たらごめんね。

0Like

Comments

  1. @waniwanisan

    Questioner

    一意性の値を返せばよいという点が盲点でした。
    問題解決いたしました。
    ありがとうございますm(__)m

Your answer might help someone💌