おそらく、これを行う最も簡単で直接的な方法は、すべての詳細テーブルをテーブルに左結合し、一致する製品をまったくProduct
除外することです。
したがって、これは本質的に@Santhoshのソリューションに小さな調整を加えたものになります(強調):
SELECT
pr.Ref,
pr.Description,
st.Current_Stock,
sa.Qty_Sold,
po.Qty_Outstanding
FROM Product pr
LEFT JOIN Stock st ON st.Ref = pr.Ref
LEFT JOIN Sales sa ON sa.Ref = pr.Ref
LEFT JOIN POs po ON po.Ref = pr.Ref
WHERE st.Ref IS NOT NULL
OR sa.Ref IS NOT NULL
OR so.Ref IS NOT NULL
;
あまり明白ではない代替手段もあります。すべてのディテール テーブルを結合してから、ディテール データをピボットします。結果のセットには、少なくともいくつかの詳細情報を持つ製品への参照のみが含まれます。そのため、結果セットを内部結合しProduct
て、出力の製品説明にアクセスできます。
お使いの SQL 製品が PIVOT 句をサポートしている場合は、次のようにすることができます。
SELECT
p.Ref,
p.Description,
s.Current_Stock,
s.Qty_Sold,
s.Qty_Outstanding
FROM (
SELECT
Ref,
Current_Stock,
Qty_Sold,
Qty_Outstanding
FROM (
SELECT
Ref,
'Current_Stock' AS Attribute,
Current_Stock AS Value
FROM Stock
UNION ALL
SELECT
Ref,
'Qty_Sold',
Qty_Sold
FROM Sales
UNION ALL
SELECT
Ref,
'Qty_Outstanding',
Qty_Outstanding
FROM POs
) d
PIVOT (
SUM(Value) FOR Attribute IN (
Current_Stock,
Qty_Sold,
Qty_Outstanding
)
) p
) s
INNER JOIN Product p ON p.Ref = s.Ref
;
グループ化と条件付き集約を使用する必要がある、より古くてより普遍的なピボット方法もあります。
SELECT
p.Ref,
p.Description,
SUM(CASE Attribute WHEN 'Current_Stock' THEN d.Value END) AS Current_Stock,
SUM(CASE Attribute WHEN 'Qty_Sold' THEN d.Value END) AS Qty_Sold,
SUM(CASE Attribute WHEN 'Qty_Outstanding' THEN d.Value END) AS Qty_Outstanding
FROM (
SELECT
Ref,
'Current_Stock' AS Attribute,
Current_Stock AS Value
FROM Stock
UNION ALL
SELECT
Ref,
'Qty_Sold',
Qty_Sold
FROM Sales
UNION ALL
SELECT
Ref,
'Qty_Outstanding',
Qty_Outstanding
FROM POs
) d
INNER JOIN Product p ON p.Ref = d.Ref
GROUP BY
p.Ref,
p.Description
;