Name-Valueテーブルを、名前を列ヘッダーとして持つ別のテーブルに変換しますが、1つの名前タイプに複数の値を含めることができます

数十

次のテーブル構造があります。

構造-1

+------------+-------------+---------+
| SymbolCode | CategoryId  | ItemId  |
+------------+-------------+---------+
|     212374 |        Cat1 |       1 |
|     212374 |        Cat2 |       6 |
|     212374 |        Cat3 |       5 |
|     212374 |        Cat3 |      50 |
+------------+-------------+---------+

この構造を次のように変換したいと思います。

IntermidiateStructure

+------------+------+------+------+
| SymbolCode | Cat1 | Cat2 | Cat3 |
+------------+------+------+------+
|     212374 |    1 |    6 |  5   |
|     212374 |    1 |    6 |  50  |
+------------+------+------+------+

PIVOT / CrossTabを使用してみましたが、ここに集計するものがないため、集計関数を使用できません。私も試してみましたCASE表現を、私は、ヌルの登場のある4行したくないCat1Cat2Cat3彼らは任意の値を持たない列を。また、で集計関数を使用するとCASECAT3列の値は1つだけになります。

私が使用しているソリューション構造は、構築しようとしているクエリの中間結果であるため、おそらく正確ではないと思います。

以下に示すStructure-1に結合する必要がある別のStructure-2があります。

+-------+------------+--------+
| Rule  | CategoryId | ItemId |
+-------+------------+--------+
| Rule1 | Cat1       |      1 |
| Rule1 | Cat2       |      6 |
| Rule2 | Cat1       |      1 |
| Rule2 | Cat2       |      6 |
| Rule2 | Cat3       |      5 |
| Rule2 | Cat3       |     50 |
+-------+------------+--------+

したがって、を見るRule1、正確な基準に一致するため、SymbolCode 212374にRule2のみRule2適用できるはずですが、それ以上でもそれ以下でもありません。

これを行うためにどのような種類のクエリを作成できますか?

タリン

集計関数を使用してデータをピボットすることもできます。複数の行を返すことができるようにするには、一意のものが必要です。あなたの状況では、私はのようなウィンドウ関数を使用しますrow_number()これにより、それぞれSymbolCode一意のシーケンスが作成されます。CategoryIDこの番号は、集計のためにグループ化するときに使用されます。

次のようなクエリから始めます。

select  
  s1.SymbolCode,
  s1.CategoryID,
  s2.ItemId,
  seq = row_number() over(partition by s1.symbolcode, s1.categoryid 
                          order by s1.itemid)
from Structure1 s1
inner join Structure2 s2
  on s1.categoryid = s2.categoryid
  and s1.ItemId = s2.ItemId

デモを参照してくださいこれにより、次の結果が得られます。

| SYMBOLCODE | CATEGORYID | ITEMID | SEQ |
|------------|------------|--------|-----|
|     212374 |       Cat1 |      1 |   1 |
|     212374 |       Cat1 |      1 |   2 |
|     212374 |       Cat2 |      6 |   1 |
|     212374 |       Cat2 |      6 |   2 |
|     212374 |       Cat3 |      5 |   1 |
|     212374 |       Cat3 |     50 |   2 |

今、あなたは持っているseqのセットごとに固有の番号を含む列をSymbolCodeCategoryIdこの値を取得したら、データを列にピボットできます。

select SymbolCode,
  Cat1 = max(case when categoryid = 'Cat1' then itemid end),
  Cat2 = max(case when categoryid = 'Cat2' then itemid end),
  Cat3 = max(case when categoryid = 'Cat3' then itemid end)
from
(
  select  
    s1.SymbolCode,
    s1.CategoryID,
    s2.ItemId,
    seq = row_number() over(partition by s1.symbolcode, s1.categoryid 
                            order by s1.itemid)
  from Structure1 s1
  inner join Structure2 s2
    on s1.categoryid = s2.categoryid
    and s1.ItemId = s2.ItemId
) d
group by symbolcode, seq;

SQL Fiddle withDemoを参照してくださいこれにより、次の最終結果が得られます。

| SYMBOLCODE | CAT1 | CAT2 | CAT3 |
|------------|------|------|------|
|     212374 |    1 |    6 |    5 |
|     212374 |    1 |    6 |   50 |

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ