2017-05-23 14 views
1

自動データ辞書を作成しようとしています。私は約200以上のテーブル(TableName)と5000+の列(Field Name)があります ピボット不明列数の値

...

+-----------+----------------+---------------+ 
| TableName | Field Name  | Lookup values | 
+-----------+----------------+---------------+ 
| Pathology | Medical Report | Avaliable  | 
| Pathology | Medical Report | Not Avaliable | 
| Pathology | Medical Report | Pending  | 
+-----------+----------------+---------------+ 
として(フィールドの値をドロップダウン)ルックアップ値を取得するためにすべてのテーブルテーブルのフィールドテーブルとルックアップテーブルに参加しました。


必要な結果

+-----------+----------------+ 
| TableName | Medical Report | 
+-----------+----------------+ 
| Pathology | Avaliable  | 
| Pathology | Not Avaliable | 
| Pathology | Pending  | 
+-----------+----------------+ 

これまでのところ私はSQLでPIVOT機能を試してみましたが、ないID列が存在しないため、集計関数として成功せずに適用することはできません。私は必要な結果セットを達成するために正確にどのように知らない私のコードの

エキス

SELECT TableName, 
     Field1, 
     Field2, 
     ..., 
     Field2000+ (this not possible as there are so many columns) 
FROM (result set 
    ) 
PIVOT 
(
    aggregated function doesn't apply as no identity column is present 
    FOR (FieldName) IN (Field1, 
          Field2, 
          ..., 
          Field2000+ (this not possible as there are so many columns) 
         ) 
) AS pivotTable 

誰かが助けてくれますか?

+0

フィールドの数に制限はありませんが、動的SQLを使用する必要があります。 Googleは "動的SQLのピボット"のためにあなたを助けるために何かを見つける – FLICKER

+0

私は動的SQLで試したが、望む結果を得ることができません。 コードで私に助けてもらうことができます – gaten

+0

私はあなたの質問を編集してテーブルのプレゼンテーションを改善し、あなたの英語の使い方をいくらか整理しました。あなたの第2文を言い直してください - それは現在混乱し混乱しています。 'Field1'から' Field4'までのあなたのコード抽出をあなたの最良の試みに置き換え、あなたのコードが生成するエラーメッセージの全文を加えてください。 – toonice

答えて

1

は、私はあなたがこのような何か必要があると思います。もちろん

IF OBJECT_ID('tempdb..#DataSource') IS NOT NULL 
BEGIN; 
    DROP TABLE #DataSource; 
END; 

CREATE TABLE #DataSource 
(
    [TableName] SYSNAME 
    ,[FieldName] NVARCHAR(64) 
    ,[LookupValues] NVARCHAR(64) 
); 

INSERT INTO #DataSource ([TableName], [FieldName], [LookupValues]) 
VALUES ('Pathology', 'Medical Report', 'Avaliable') 
     ,('Pathology', 'Medical Report', 'Not Avaliable') 
     ,('Pathology', 'Medical Report', 'Pending') 
     ,('Pathology', 'Laboratory Report', 'Avaliable') 
     ,('Pathology', 'Laboratory Report', 'Not Avaliable') 
     ,('Pathology', 'Laboratory Report', 'Pending') 
     ,('Pathology', 'Laboratory Report', 'Declined') 
     ,('Pathology', 'Laboratory Report', 'Private') 
     ,('Pathology', 'Laboratory Report', 'Rejected') 
     ,('Oncology', 'Laboratory Report', 'Avaliable') 
     ,('Oncology', 'Laboratory Report', 'Not Avaliable') 
     ,('Oncology', 'Laboratory Report', 'Pending') 
     ,('Morgue', 'Death Report', 'Type 1') 
     ,('Morgue', 'Death Report', 'Type 2') 
     ,('Morgue', 'Death Report', 'Type 3') 
     ,('Morgue', 'Death Report', 'Type 4'); 

DECLARE @DynamicSQLStatement NVARCHAR(MAX) 
     ,@PIVOTcolumns NVARCHAR(MAX); 

SELECT @PIVOTcolumns = STUFF 
(
    (
     SELECT DISTINCT ',[' + [FieldName] + ']' 
     FROM #DataSource 
     FOR XML PATH(''), TYPE 
    ).value('.', 'nvarchar(max)') 
    ,1 
    ,1 
    ,'' 
); 

SET @DynamicSQLStatement = N' 
SELECT * 
FROM 
(
    SELECT * 
      ,ROW_NUMBER() OVER (PARTITION BY [TableName], [FieldName] ORDER BY [LookupValues]) AS [RowID] 
    FROM #DataSource 
) DS 
PIVOT 
(
    MAX([LookupValues]) FOR [FieldName] IN (' + @PIVOTcolumns + ') 
) PVT 
ORDER BY [TableName];' 

EXEC sp_executesql @DynamicSQLStatement; 

enter image description here

、あなたのサンプルデータとを、結果は以下のようになります。

enter image description here

私はあなたの確信していますあなたの問題を解決するためにコードを使用することができます。何も複雑ではありません - PIVOTが実行される値の文字列を作成するだけでよいです。

+0

私は結果セットとあなたの答えを試してみたときにエラーが発生し、Excelでコピーします。 タイトル:Microsoft SQL Server Management Studio ------------------------------ タイプ 'System.OutOfMemoryException'の例外がありましたスローされる。 (mscorlib) .value( '。'、 'nvarchar(max)')はXMLのデータ型を変換するためにそこにありますか? – gaten

+0

'.value( '。'、 'nvarchar(max)')は、XML値を取得して文字列に変換することを意味します。なぜExcelでコードを実行しているのですが、Management Studioではコードを実行していません。 – gotqn

+0

私はExcelでコードを実行していません。管理スタジオでコードを実行してからExcelにコピーしています。その結果、ヘッダーが非常に多くコピーされ、結果をExcelに貼り付けようとすると例外がスローされます。 – gaten