sql >> データベース >  >> RDS >> Mysql

過去4四半期のデータを表示するビューを作成するにはどうすればよいですか?

    うーん。 「最後の4四半期」を「データに含まれる最後の4四半期」と解釈すると、次の1つの方法があります。

    まず、次のようにして4つの四半期を取得できます。

    select distinct p_year, p_quarter
    from production p
    order by p_year desc, p_quarter desc
    limit 4;
    

    変数を使用してそれらを列挙できます:

    select p_year, p_quarter, (@rn := @rn + 1) as enum
    from (select distinct p_year, p_quarter
          from production p
          order by p_year desc, p_quarter desc
          limit 4
         ) p cross join
         (select @rn := 0) params
    

    次に、これをクエリで使用してデータをピボットできます。

    select p.person_id,
           sum(case when seqnum = 1 then num else 0 end) as num_quarter_1,
           sum(case when seqnum = 2 then num else 0 end) as num_quarter_2,
           sum(case when seqnum = 3 then num else 0 end) as num_quarter_3,
           sum(case when seqnum = 4 then num else 0 end) as num_quarter_4
    from production p join
         (select p_year, p_quarter, (@rn := @rn + 1) as seqnum
          from (select distinct p_year, p_quarter
                from production p
                order by p_year desc, p_quarter desc
                limit 4
               ) p cross join
               (select @rn := 0) params
         ) yq
         using (p_year, p_quarter)
    group by p.person_id;
    

    編集:

    現在の四半期に基づいて四半期を定義している場合は、非常によく似たことができます。

    select p.person_id,
           sum(case when seqnum = 1 then num else 0 end) as num_quarter_1,
           sum(case when seqnum = 2 then num else 0 end) as num_quarter_2,
           sum(case when seqnum = 3 then num else 0 end) as num_quarter_3,
           sum(case when seqnum = 4 then num else 0 end) as num_quarter_4
    from production p join
         (select year(curdate()) as p_year, quarter(curdate()) as p_quarter, 1 as seqnum union all
          select year(curdate() - interval 1 quarter) as p_year, month(curdate() - interval 1 quarter) as p_quarter, 2 as seqnum union all
          select year(curdate() - interval 2 quarter) as p_year, month(curdate() - interval 2 quarter) as p_quarter, 3 as seqnum union all
          select year(curdate() - interval 2 quarter) as p_year, month(curdate() - interval 3 quarter) as p_quarter, 4 as seqnum           
         ) yq
         using (p_year, p_quarter)
    group by p.person_id;
    

    次のような他のアプローチがあります:

    select person_id,
           sum(case when year(curdate()) = p_year and quarter(curdate()) = p_quarter
                    then num else 0
               end) as num_quarter_1,
           sum(case when year(curdate() - interval 1 quarter) = p_year and quarter(curdate() - interval 1 quarter) = p_quarter
                    then num else 0
               end) as num_quarter_2,
           sum(case when year(curdate() - interval 2 quarter) = p_year and quarter(curdate() - interval 2 quarter) = p_quarter
                    then num else 0
               end) as num_quarter_3,
           sum(case when year(curdate() - interval 3 quarter) = p_year and quarter(curdate() - interval 3 quarter) = p_quarter
                    then num else 0
               end) as num_quarter_4
    from production p
    group by person_id;
    


    1. 特定のタグがない投稿を選択してください

    2. SqlServerのraiserrorメッセージをC#に保存する

    3. アンダースコアがOracleのような句で機能していません

    4. SQLServer2008のリードラグ機能の代替