2017-10-14 15 views
1

私は50,000レコードのデータセットを持っています。形式は次のようになります。SQL Server:UNPIVOTクエリは、次のような結果を達成しますか?

Handle | Category | A | B | C | Misc Info 
-------|----------|-----|-----|-----|----------- 
H1  | X  | 100 | 120 | 150 | kk 
H2  | Y  | 100 | 120 | 150 | mm 
H3  | Z  | 100 | 120 | 150 | nn 

次のようなクエリ結果が必要です。

Handle | Category | Option | Value | Misc Info 
-------|----------|--------|-------|----------- 
H1  | X  | A  | 100 | kk 
H1  |   | B  | 120 | 
H1  |   | C  | 150 | 
-------|----------|--------|-------|----------- 
H2  | Y  | A  | 100 | mm 
H2  |   | B  | 120 | 
H2  |   | C  | 150 | 
-------|----------|--------|-------|----------- 
H3  | Z  | A  | 100 | nn 
H3  |   | B  | 120 | 
H3  |   | C  | 150 | 

これを達成するためのT-SQLクエリは何ですか?

+0

これはSQLの問題ではなくプレゼンテーションの問題のようです。クライアント側のコードを使ってこれを処理できませんか? –

答えて

0

私はそのようなことだと思う:

SELECT Handle, Category, "A" AS Option, A as Value, Misc, Info 
UNION ALL 
SELECT Handle, Category, "B" AS Option, B as Value, Misc, Info 
UNION ALL 
SELECT Handle, Category, "C" AS Option, C as Value, Misc, Info 
ORDER BY Category 

をしかし、あなたは、このクエリタイプを必要とする場合は、Database normalizationを行う必要があります。

1

あなたはcross applyを使用してこの操作を行うことができます。

select v.handle, v.category, v.option, v.value, v.misc_info 
from t cross apply 
    (values (handle, category, 'A', a, misc_info, 1), 
      (handle, NULL, 'B', b, NULL, 2), 
      (handle, NULL, 'C', c, NULL, 3) 
    ) v(handle, category, option, value, misc_info, priority) 
order by handle, priority; 

通常、変換のこの種は、最高のプレゼンテーション層で処理されます。結果セットの順序が重要である場合は、order byが明示されていないため、結果セットはの順不同でであるため、必要です。

categorymisc_infoは時々「前」の値に依存しているため順序が重要です。)

この場合、作業はSQLで非常に難しい、実際にはありません。デフォルトの注文に頼らないように覚えておいてください。

0

以下のようにUNPIVOTを使用できます。

SELECT [Handle],[Category],[Option],[Value],[Misc_Info] 
FROM 
@data 
UNPIVOT 
(
    [Value] FOR [Option] IN (A,B,C) 
) AS unpivotTable; 
0

まあ...私は何かを思いついた。それは私のために働いたように見えます。それが最も効率的かどうかはわかりません。

SELECT 
    [Handle], 
    CASE [Category] 
     WHEN 'A' THEN [Category] 
     ELSE '' 
    END AS [Category], 
    [Option], 
    [Value], 
    CASE [Misc Info] 
     WHEN 'A' THEN [Misc Info] 
     ELSE '' 
    END AS [Misc Info], 
FROM (
    SELECT [Handle], [Category], [Option], [Value], [Misc Info] 
    FROM Test_Table 
    UNPIVOT 
    (
    [Value] for [Option] in ([A], [B], [C]) 
    ) as P 
) as X; 
関連する問題