1

これについて私の頭を理解することはできません。製品に関連する 3 つのテーブル (在庫、販売、注文書) があり、それらをすべて結合できる 1 つの共通フィールドがあります。すべての製品を含む 4 番目のテーブルがあります。製品は、これらのテーブル (在庫、販売、注文書) に情報を持っている場合と持っていない場合がありますが、製品テーブルにはレコードがあります。

3 つのテーブル (在庫、販売、発注) のいずれかに情報が含まれる製品ごとに 1 つの行で終了する必要があります。

表の簡略図を以下に示します。

製品表、参照、説明

在庫テーブル、Ref、Current_Stock

販売テーブル、Ref、Qty_Sold

POs テーブル、Ref、Qty_Outstanding

私は次で終わる必要があります:

参照、説明、Current_Stock、Qty_Sold、Qty_Outstanding

ありがとう

ニグ

4

3 に答える 3

1

おそらく、これを行う最も簡単で直接的な方法は、すべての詳細テーブルをテーブルに左結合し、一致する製品をまったく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
;
于 2013-04-06T11:39:18.187 に答える
0
SELECT P.REF, P.DESCRIPTION, S.CURRENT_STOCK, SALES.QTY_SL, POS.QTY_OUTSTANDING
FROM PRODUCTS P
LEFT JOIN STOCK S
ON S.REF = P.REF
LEFT JOIN SALES SALES
ON SALES.REF = P.REF
LEFT JOIN POS
ON POS.REF = P.REF
于 2013-04-05T11:26:02.243 に答える
0

REF一意であり、すべてのテーブルで外部キーのように使用されていると仮定します

多分あなたは試すことができます

SELECT pt.REF, pt.DESCRIPTION, st.CURRENT_STOCK, sat.QTY_SOLD, pot.QTY_OUTSTANDING
FROM PRODUCTTABLE pt
INNER JOIN STOCKTABLE st
ON st.REF = pt.REF
INNER JOIN SALESTABLE sat
ON sat.REF = pt.REF
INNER JOIN POSTABLE pot
ON pot.REF = pt.REF

この結合操作のグラフィカルな要約が非常に便利で気に入っています。

于 2013-04-05T11:26:58.987 に答える