1

私は集計レポートに取り組んでおり、これまでのところデータを入手していますが、ここから先に進む方法がわかりません。SQLでうまくいきますが、スキルが限られています

一時テーブルにフォローがあります

ID   Count  Action
2   23      Installed
2   12      Uninstalled
2   36      Unchanged
3   12      Installed
3   25      Unchanged
4   35      Installed
4   25      Unchanged

これをこのフォーマットに変換したい

ID  Installed   Uninstalled Unchanged
2   23          12          36
3   12          0           36
4   35          0           25

どこに行けばいいのか、どうやってこれを達成し始めるのかさえわからず、正しい方向に私を向けるための何かを見つけることができません(どこかにあると確信しています)

どんな助けでも適用されます

4

3 に答える 3

1

それはピボットと呼ばれます

これがそれに関するドキュメントです

構文は

SELECT <non-pivoted column>,
    [first pivoted column] AS <column name>,
    [second pivoted column] AS <column name>,

    ...

    [last pivoted column] AS <column name>
FROM
    (<SELECT query that produces the data>)
    AS <alias for the source query>
PIVOT
( 
    <aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
    IN ( [first pivoted column], [second pivoted column],
    ... [last pivoted column])

) AS <alias for the pivot table>

<optional ORDER BY clause>;
于 2012-11-20T13:42:09.263 に答える
1

これを試して:

SELECT
  ID, 
  MAX(CASE WHEN "Action" = 'Installed' THEN Count END) AS 'Installed',
  MAX(CASE WHEN "Action" = 'Uninstalled ' THEN Count END) AS 'Uninstalled',
  MAX(CASE WHEN "Action" = 'Unchanged' THEN Count END) AS 'Unchanged'
FROM Table
GROUP BY ID;

または、次のPIVOTようにSQLServerテーブル演算子を使用します。

SELECT *
FROM 
(
   SELECT * FROM table
)t
PIVOT
(
   MAX("Count") FOR "Action" IN([Installed], [Uninstalled], [Unchanged])
) p

両方のSQLフィドルデモ

ただし、sの数が不明なAction場合は、次のように動的に選択する必要があります。

DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Action) 
                    from Table1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');

SET @query = 'SELECT ID,  ' + @cols + ' from 
             (
                SELECT * FROM Table1
             ) x
             PIVOT 
             (
                MAX(count)
                FOR action IN (' + @cols + ')
             ) p ';

EXECUTE(@query);

SQL Fiddleデモ(動的バージョン)

于 2012-11-20T13:44:25.787 に答える
1

ピボットは優れていますが、非常に遅い場合があります。1つなしで試してみてください。

SELECT ID
    , SUM(CASE WHEN [Action] = 'Installed' THEN [Count] ELSE 0 END) AS Installed
    , SUM(CASE WHEN [Action] = 'Uninstalled' THEN [Count] ELSE 0 END) AS Uninstalled
    , SUM(CASE WHEN [Action] = 'Unchanged' THEN [Count] ELSE 0 END) AS Unchanged
FROM <table>
GROUP BY ID
于 2012-11-20T13:45:13.590 に答える