次のテーブル構造があります。
構造-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行したくないCat1
、Cat2
とCat3
彼らは任意の値を持たない列を。また、で集計関数を使用するとCASE
、CAT3
列の値は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
のセットごとに固有の番号を含む列をSymbolCode
、CategoryId
。この値を取得したら、データを列にピボットできます。
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]
コメントを追加