90

私はSQLに非常に慣れていません。

次のようなテーブルがあります。

ID | TeamID | UserID | ElementID | PhaseID | Effort
-----------------------------------------------------
1  |   1    |  1      |   3       |  5     |   6.74
2  |   1    |  1      |   3       |  6     |   8.25
3  |   1    |  1      |   4       |  1     |   2.23
4  |   1    |  1      |   4       |  5     |   6.8
5  |   1    |  1      |   4       |  6     |   1.5

そして、このようなデータを取得するように言われました

ElementID | PhaseID1 | PhaseID5 | PhaseID6
--------------------------------------------
    3     |   NULL   |   6.74   |   8.25
    4     |   2.23   |   6.8    |   1.5

PIVOT関数を使用する必要があることを理解しています。しかし、はっきりとは理解できません。誰かが上記のケースでそれを説明できれば、それは大きな助けになるでしょう。

4

7 に答える 7

116

PIVOTデータを 1 つの列から複数の列にローテーションするために使用される。

あなたの例では、ここに STATIC Pivot があります。これは、回転する列をハードコーディングすることを意味します。

create table temp
(
  id int,
  teamid int,
  userid int,
  elementid int,
  phaseid int,
  effort decimal(10, 5)
)

insert into temp values (1,1,1,3,5,6.74)
insert into temp values (2,1,1,3,6,8.25)
insert into temp values (3,1,1,4,1,2.23)
insert into temp values (4,1,1,4,5,6.8)
insert into temp values (5,1,1,4,6,1.5)

select elementid
  , [1] as phaseid1
  , [5] as phaseid5
  , [6] as phaseid6
from
(
  select elementid, phaseid, effort
  from temp
) x
pivot
(
  max(effort)
  for phaseid in([1], [5], [6])
)p

これは、動作するバージョンのSQL デモです。

これは、列のリストを動的に作成して PIVOT を実行する動的 PIVOT を介して行うこともできます。

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.phaseid) 
            FROM temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT elementid, ' + @cols + ' from 
            (
                select elementid, phaseid, effort
                from temp
           ) x
            pivot 
            (
                 max(effort)
                for phaseid in (' + @cols + ')
            ) p '


execute(@query)

両方の結果:

ELEMENTID   PHASEID1    PHASEID5    PHASEID6
3           Null        6.74        8.25
4           2.23        6.8         1.5
于 2012-05-03T10:19:51.967 に答える
8

これらは非常に基本的なピボットの例です。

SQL SERVER – PIVOT および UNPIVOT テーブルの例

上記の製品テーブルのリンクの例:

SELECT PRODUCT, FRED, KATE
FROM (
SELECT CUST, PRODUCT, QTY
FROM Product) up
 PIVOT (SUM(QTY) FOR CUST IN (FRED, KATE)) AS pvt
ORDER BY PRODUCT

レンダリング:

 PRODUCT FRED  KATE
 --------------------
 BEER     24    12
 MILK      3     1
 SODA   NULL     6
 VEG    NULL     5

同様の例は、SQL Server のピボット テーブルに関するブログ投稿にも記載されています。簡単なサンプル

于 2012-05-03T09:57:33.477 に答える
3

互換性エラーを設定するには

ピボット機能を使用する前にこれを使用してください

ALTER DATABASE [dbname] SET COMPATIBILITY_LEVEL = 100  
于 2013-09-20T06:45:23.140 に答える