1

似乎无法理解这一点。我有三个与产品相关的表(库存、销售、采购订单),它们具有一个共同的字段,可以将它们全部连接在一起。我有第四张桌子,里面有所有的产品。产品在这些表(库存、销售额、采购订单)中可能有也可能没有信息,但在产品表中会有记录。

我需要以每个产品的一行结束,其中包含三个表之一(库存、销售和采购订单)中的信息。

下表的简化视图如下:

产品表、参考、说明

库存表,参考,Current_Stock

销售表,Ref, Qty_Sold

POs 表、参考、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 回答