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

SQLで年のテーブルをピボットする方法は?

    日付値ごとに年を取得してから、それらの値を PIVOT する必要があります。これを取得するには、SQL Server のいくつかの異なる関数を使用できます。

    • DatePart - 構文は DatePart(year, yourDate) になります
    • - 構文は Year(yourDate) です

    これらのいずれかが各日付の年を返すので、その年を PIVOT に新しい列として配置します。

    select plate, [2011], [2012], [2013], [2014], [2015], [2016], [2017]
    from
    (
      SELECT tnk.Plate, 
         Cast(mua.Tarih as Date) as M_Date,
         year(mua.Tarih) yr
      FROM Muayene mua 
      LEFT JOIN Tanker tnk 
        on (tnk.OID=mua.TankerId)
    ) d
    pivot
    (
      max(m_date)
      for yr in ([2011], [2012], [2013], [2014], [2015], [2016], [2017])
    ) piv;
      

    デモ を見る .このクエリでは、列 mua.Id を削除したことに気付くでしょう。 .これは、データをピボットすると、クエリの各列でグループ化されるためです。これらの値は異なるため、異なる行が返されます。クエリから列を削除すると、結果が返されます:

    <プレ>| PLATE | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | |----------|------------|--------|--------|------------|------------|------------|------------| | 34VM7969 | 2011-08-02 | (null) | (null) | 2014-08-08 | 2015-02-21 | 2016-08-19 | 2017-03-09 |

    最後に、日付の数が不明な場合は、次の 2 つのことをお勧めします - カレンダー テーブルを使用し、次に動的 SQL を使用します。

    次に、Calendar テーブルは、次のようなクエリに使用できる単なる日付のリストです:

    create table calendar
    (
      date datetime
    );
    
    insert into calendar
    select '2011-01-01' union all
    select '2012-01-01' union all
    select '2013-01-01' union all
    select '2014-01-01' union all
    select '2015-01-01' union all
    select '2016-01-01' union all
    select '2016-01-01' union all
    select '2017-01-01' union all
    select '2018-01-01' 
      

    次に、SQL 文字列で年のリストを作成し、その文字列を次のように実行します。

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT ',' + QUOTENAME(year(date)) 
                        from calendar
                        group by year(date)
                        order by year(date)
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT plate, ' + @cols + ' 
                from 
                (
                  select plate, 
                    m_Date = convert(varchar(10), m_date, 120), 
                    year(m_date) yr
                  from yourquery
                ) x
                pivot 
                (
                    max(m_date)
                    for yr in (' + @cols + ')
                ) p '
    
    execute sp_executesql @query;
      

    デモ を見る




    1. SparkDataframesUPSERTからPostgresテーブルへ

    2. データベースをgit(バージョン管理)下に置くにはどうすればよいですか?

    3. Codeigniter:SQLサーバーへの接続をセットアップする方法(2008)

    4. SQLiteUPSERTと新しいRETURNING句に関するクイック投稿。