2012-03-07 4 views
1

私はSQLピボットを一度も使用していませんが、今は私のチャンスだと思います。問題は、私は本当にどのようにわからない。私はドキュメンテーションを読んできましたが、私が望む結果がやや複雑に思えるようで、この時点では簡単なピボットをあまり扱うことはできません。SQL Sever Pivot Many Columns

私はこのテーブル

Create table dataTable (dataID int, containerID int) 

を持っていると私の結果セットがフォーマットであるように、私はそれを照会する:

のdataTableからのすべてのデータIDが行になり、ビット
Create table pivotTable (DataID int, Container1 bit, Container2 bit, ...ContainerN bit) 

DataTableにタプル{DataID、ContainerN}が存在すればConatinerNの値は1、そうでない場合は0になります。 480個のContainerIDがあるので、それらをすべて手作業で指定するのではなく、必要であればそれを指定できます。

ありがとうございました!

+2

ダイナミックピボット例:http://stackoverflow.com/questions/2209700/how-to-use-pivot-in-sql-をserver-2005-stored-procedure-joined-two-views –

答えて

2

たぶん、このような何か:

テストデータ

Create table dataTable (dataID int, containerID int) 

INSERT INTO dataTable 
VALUES 
    (1,1), 
    (2,1), 
    (3,3), 
    (4,2) 

ユニーク列

DECLARE @cols VARCHAR(MAX) 
DECLARE @colsWithIsNull VARCHAR(MAX) 
;WITH CTE 
AS 
(
    SELECT 
     ROW_NUMBER() OVER(PARTITION BY containerID ORDER BY containerID) AS RowNbr, 
     CAST(containerID AS VARCHAR(100)) AS containerID 
    FROM 
     dataTable 
) 
SELECT @cols = COALESCE(@cols + ','+QUOTENAME('Container'+containerID), 
        QUOTENAME('Container'+containerID)), 
     @colsWithIsNull= COALESCE(@colsWithIsNull + ',CAST(ISNULL('+QUOTENAME('Container'+containerID)+',0) AS BIT) AS '+QUOTENAME('Container'+containerID), 
        'CAST(ISNULL('+QUOTENAME('Container'+containerID)+',0) AS BIT) AS '+QUOTENAME('Container'+containerID)) 
FROM 
    CTE 
WHERE 
    CTE.RowNbr=1 

ダイナミックピボット

私の場合は
DECLARE @query NVARCHAR(4000)= 
N'SELECT 
    dataID, 
    '[email protected]+' 
FROM 
(
    SELECT 
     ''Container''+CAST(dataTable.containerID AS VARCHAR(100)) AS ContainerText, 
     1 AS isContainer, 
     dataTable.dataID 
    FROM 
     dataTable 
) AS p 
PIVOT 
(
    MAX(isContainer) 
    FOR ContainerText IN ('[email protected]+') 
) AS pvt' 

EXECUTE(@query) 

私はテストテーブルをドロップします:ここに

DROP TABLE dataTable 
+0

ビンゴ。私は既にSSRSから欲しいデータを得ましたが、これは私が探していたものです。ありがとう。 – Colin

+0

問題ありません..喜んで助ける.. – Arion

1

このようにデータをピボットすることは意味がありません。これは、アプリケーションのデータアクセス層で実行するのがより良い作業です。あなたは、あなたがあなたの人生を容易にするために

{ DataID INT, ContainerNumber INT } 

...このように設定されたデータを返すべきである言ったように、列のみで1を持つコンテナを返し、その後、ギャップを埋めます。

+0

私は私が従うかどうかわかりません。私が持っているデータはすでに '{DataID INT、ContainerNumber INT} 'の形式ですが、それは私が望むものではありません。 – Colin

+0

私は、あなたのデータベースが絶対的に必要でない限り、ピボットされた結果セットを返すべきではないと言っています。この作品は、アプリケーション内の他の場所に属します。つまり、カーソルを使用してすべての行を処理し、ピボットされたデータのクエリを動的に作成する必要がある場合は、 – judda

+0

これはそうではありません。これは、手作業で一緒に掻き集めたアドホックデータセットです。それは言われているが、圧倒的多数の値がゼロである約500列のテーブルを格納することはかなり非効率的であり、この一回限りのレポート以外は基本的には非常に面倒であるようだ。 また、ピボット機能とまったく同じように思えるので、カーソルを使用しないでください。使用方法を知りたいのですが。 – Colin