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

サマリーレポートのような表形式のクエリ結果を選択したい

    SQL Server 2008では、PIVOTクエリを使用してこのタスクを非常に簡単に処理できます。次の例は、データを次の形式に変換することに依存しています(すでに行っているように見えます):

    Name        Month    Value
    ----------  -------  -----
    District 1  Month 1     10
    District 1  Month 2      5
    District 1  Month 3      6
    District 2  Month 1      1
    District 2  Month 2      2
    District 2  Month 3      3
    District 3  Month 1      8
    District 3  Month 2      6
    District 3  Month 3     11
    

    それができる場合、PIVOTクエリは次のようになります。

    DECLARE @myTable AS TABLE([Name] VARCHAR(20), [Month] VARCHAR(20), [Value] INT)
    INSERT INTO @myTable VALUES ('District 1', 'Month 1', 10)
    INSERT INTO @myTable VALUES ('District 1', 'Month 2', 5)
    INSERT INTO @myTable VALUES ('District 1', 'Month 3', 6)
    INSERT INTO @myTable VALUES ('District 2', 'Month 1', 1)
    INSERT INTO @myTable VALUES ('District 2', 'Month 2', 2)
    INSERT INTO @myTable VALUES ('District 2', 'Month 3', 3)
    INSERT INTO @myTable VALUES ('District 3', 'Month 1', 8)
    INSERT INTO @myTable VALUES ('District 3', 'Month 2', 6)
    INSERT INTO @myTable VALUES ('District 3', 'Month 3', 11)
    
    SELECT [Name], [Month 1], [Month 2], [Month 3], [NameTotalValue] AS [Total]
    FROM
    (
          SELECT [Name], [Month], [Value], 
                 SUM([Value]) OVER (PARTITION BY [Name]) as [NameTotalValue] 
          FROM @myTable
        UNION 
          SELECT 'Total', [Month], SUM([Value]), (SELECT SUM([Value]) FROM @myTable)
          FROM @myTable
          GROUP BY [Month]
    ) t
    PIVOT
    (
        SUM([Value]) FOR [Month] IN ([Month 1], [Month 2], [Month 3]) 
    ) AS pvt
    ORDER BY pvt.[Name]
    

    この例では、SUM([Value]) OVER PARTITIONを使用しました 各地区の合計を取得するために、次にUNIONを実行して合計行を下部に追加しました。結果は次のようになります:

    Name        Month 1 Month 2 Month 3 Total
    ----------- ------- ------- ------- -----
    District 1       10       5       6    21
    District 2        1       2       3     6
    District 3        8       6      11    25
    Total            19      13      20    52
    

    このアプローチについて気付くのは、テーブルの上部に必要な列名を事前に知っておく必要があるということです。レポートを1年間実行するように設定している場合、これは簡単に実行できますが、列の数が変更される場合は注意が必要です。ユーザーがカスタムの日付範囲(つまり、07 / 2011-10/2011または06/2011-11 / 2011)を指定できるようにする場合、その要件を処理する1つの方法は、動的SQLを使用してPIVOTクエリを作成することです。次に、sp_executesql を使用して実行します。 。




    1. PHPmyadmin内のデータファイルの読み込み

    2. 古いMySQLバージョンのGroup_concat

    3. PL/SQL-IN句で配列を使用する方法

    4. SQLServer2017バックアップ-1