私の問題のサンプルシナリオをまとめました。誰かが私を正しい方向に向けるのに十分であることを願っています.
私は2つのテーブルを持っています
製品
製品メタ
次の結果セットが必要です
私の問題のサンプルシナリオをまとめました。誰かが私を正しい方向に向けるのに十分であることを願っています.
私は2つのテーブルを持っています
製品
製品メタ
次の結果セットが必要です
これは2年前のものだと思いますが、受け入れられた回答では動的SQLを使用する必要があり、最も支持された回答が機能しないことに悩まされています。
Select P.ProductId, P.Name
, Min( Case When PM.MetaKey = 'A' Then PM.MetaValue End ) As A
, Min( Case When PM.MetaKey = 'B' Then PM.MetaValue End ) As B
, Min( Case When PM.MetaKey = 'C' Then PM.MetaValue End ) As C
From Products As P
Join ProductMeta As PM
On PM.ProductId = P.ProductId
Group By P.ProductId, P.Name
Group By を使用する必要があります。そうしないと、ずらした結果が得られます。Group By を使用している場合は、Group By 句にない各列を集計関数 (またはサブクエリ) でラップする必要があります。
過去に次のアプローチを使用して成功しました...
SELECT [p].ProductID,
[p].Name,
MAX(CASE [m].MetaKey
WHEN 'A'
THEN [m].MetaValue
END) AS A,
MAX(CASE [m].MetaKey
WHEN 'B'
THEN [m].MetaValue
END) AS B,
MAX(CASE [m].MetaKey
WHEN 'C'
THEN [m].MetaValue
END) AS C
FROM Products [p]
INNER JOIN ProductMeta [m]
ON [p].ProductId = [m].ProductId
GROUP BY [p].ProductID,
[p].Name
を使用して集計を転置することも役立ちます...
SUM(CASE x WHEN 'y' THEN yVal ELSE 0 END) AS SUMYVal
編集
また、これはANSI標準SQLを使用しているため、プラットフォーム間で機能することに注意してください:)
データベースエンジンが2005で、データベースが2000互換モードの場合、2005データベースからクエリを実行することで、互換性の低いモードを回避できます。次のようなクエリでテーブルに3つの部分の命名規則を使用して、2000データベースをターゲットにします。DatabaseNameHere.dbo.TableNameHere
Select a.ProductId
,a.Name
,(Select c.MetaValue
From [Product Meta] c
Where c.ProductId = a.ProductId
And c.MetaKey = 'A') As 'A'
,(Select d.MetaValue
From [Product Meta] d
Where d.ProductId = a.ProductId
And d.MetaKey = 'B') As 'B'
,(Select e.MetaValue
From [Product Meta] e
Where e.ProductId = a.ProductId
And e.MetaKey = 'C') As 'C'
From Products a
Order By a.ProductId Asc