如何在不复制某些返回值的情况下使用两个内部联接?

bf1o4zei  于 2022-10-22  发布在  其他
关注(0)|答案(1)|浏览(93)

我希望通过分组方式,将采购订单上不同供应商的金额与相同项目编号的金额分开。
我有5张table。我已将我当前的查询和我正在使用的表格包含在下面。
每次我使用两个内部连接时,都会显示重复的值,当我使用子查询时,我会收到一个错误,说我不能从子查询返回多个值。

CREATE TABLE stock(
    stocknumber     VARCHAR(30),    
    location        VARCHAR(30)
);
INSERT INTO stock VALUES
('22-2552',     'A1');

SELECT * FROM stock
库存编号位置
22-2552A1
CREATE TABLE head(
    location        VARCHAR(30),
    dateordered     DATE,
    ponumber        INT
);

INSERT INTO head VALUES
('A1',  '10/14/2022',   1),
('A1',  '10/14/2022',   2),
('A1',  '10/14/2022',   3),
('A1',  '10/14/2022',   4);

SELECT * FROM head;
位置日期排序编号
A12022-10-141
A12022-10-142
A12022-10-143
A12022-10-144
CREATE TABLE details(
    stocknumber         VARCHAR(30),
    quantityordered     INT,
    vendornumber        INT,
    ponumber            INT
);
INSERT INTO details VALUES
('22-2552',     3,  15,     1),
('22-2552',     2,  20,     2),
('22-2552',     1,  15,     3),
('22-2552',     4,  20,     4);

SELECT * FROM details;
库存编号订购数量供应商编号产品编号
22-25523151
22-25522202
22-25521153
22-25524204
CREATE TABLE head1(
    location        VARCHAR(30),
    dateordered     DATE,
    ponumber        INT
);

INSERT INTO head1 VALUES
('A1',  '10/14/2022',   5),
('A1',  '10/14/2022',   6),
('A1',  '10/14/2022',   7),
('A1',  '10/14/2022',   8);

SELECT * FROM head1;
位置日期排序编号
A12022-10-145
A12022-10-146
A12022-10-147
A12022-10-148
CREATE TABLE details1(
    stocknumber         VARCHAR(30),
    quantityordered     INT,
    vendornumber        INT,
    ponumber            INT
);
INSERT INTO details1 VALUES
('22-2552',     7,  15,     5),
('22-2552',     6,  20,     6),
('22-2552',     5,  15,     7),
('22-2552',     10,     20,     8);

SELECT * FROM details1;
库存编号订购数量供应商编号产品编号
22-25527155
22-25526206
22-25525157
22-255210208
SELECT ST.stocknumber,
       ST.location, 
       PH2.vendornumber AS PHVN,

       PO2.vendornumber AS POVN,
       SUM(PH2.quantityordered) AS phOrderQty,
       SUM(PO2.quantityordered) AS poOrderQty
FROM       stock ST

INNER JOIN head PH1
        ON PH1.location = ST.location
INNER JOIN details PH2
        ON ST.stocknumber = PH2.stocknumber
       AND PH1.ponumber = PH2.ponumber

INNER JOIN head1 PO1
        ON PO1.location = ST.location
INNER JOIN details1 PO2
        ON ST.stocknumber = PO2.stocknumber
       AND PO1.ponumber = PO2.ponumber

WHERE ST.stocknumber IN ('22-2552', 'JW00', 'JS20FT', 'JW090') 
  AND PH1.location = 'A1'
GROUP BY ST.stocknumber,
         ST.location,
         PH2.vendornumber,

         PO2.vendornumber
库存编号位置PHVNPOVNphOrderQtypoOrderQty
22-2552A11515824
22-2552A11520832
22-2552A120151224
22-2552A120201232

我一直在回来
|库存编号|位置|PHVN|POVN|phOrderQty|poOrderQty|
| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |
|22-2552 | A1 | 15 | 15 | 8 | 24|
|22-2552 | A1 | 15 | 20 | 8 | 32|
|22-2552 | A1 | 20 | 15 | 12 | 24|
|22-2552 | A1 | 20 | 20 | 12 | 32|
我应该得到的是
|库存编号|位置|PHVN|POVN|phOrderQty|poOrderQty|
| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |
|22-2552 | A1 | 15 | 15 | 4 | 12|
|22-2552 | A1 | 20 | 20 | 6 | 16|

yws3nbqq

yws3nbqq1#

您不想将PO订单与PH订单合并,您想合并它们。
(更好的方法是将它们放在同一个表中,因为您的数据结构似乎已损坏,需要将它们合并在一起。)

WITH
  all_orders AS
(
  SELECT
    h.location,
    h.ponumber,
    d.stocknumber,
    d.vendornumber,
    d.quantityordered AS ph_qty,
    0                 AS po_qty
  FROM
    head      AS h
  INNER JOIN
    details   AS d
      ON d.ponumber = h.ponumber

  UNION ALL

  SELECT
    h.location,
    h.ponumber,
    d.stocknumber,
    d.vendornumber,
    0                 AS ph_qty,
    d.quantityordered AS po_qty
  FROM
    head1      AS h
  INNER JOIN
    details1   AS d
      ON d.ponumber = h.ponumber
)
SELECT
  s.location,
  s.stocknumber,
  o.vendornumber,
  SUM(o.ph_qty), 
  SUM(o.po_qty)
FROM
  stock        AS s
INNER JOIN
  all_orders   AS o
    ON  o.location    = s.location
    AND o.stocknumber = s.stocknumber
GROUP BY
  s.location,
  s.stocknumber,
  o.vendornumber

https://dbfiddle.uk/lROTPIER
您甚至不需要在stock表上加入,因为您请求的所有列都已经在其他表中了。

相关问题