[英]LEFT JOIN of two tables, SUM, GROUP
我有兩個表,INPUT 和 OUTPUT。
包含列 ID、productName、QTY、buyPrice、sellPrice 的 INPUT 表。 包含列 ID、產品名稱、數量的 OUTPUT 表。 兩者都可以有多個具有相同產品名稱和不同(或相同)數量的輸入。 OUTPUT 不能有沒有首先出現在 INPUT 表中的 productName。
我正在嘗試查詢兩個表並獲得最終結果 - 類似這樣的:來自 INPUT 表的 productName, SUM(QTY) (GROUP BY productName), productName, SUM(QTY) from OUTPUT (GROUP BY productName)
例子:
輸入
ID | productName | QTY | buyPrice | sellPrice
1 | dress 007 | 2 | 700 | 1400
2 | shirt 001 | 4 | 800 | 1900
3 | dress 007 | 10 | 700 | 1500
4 | dress 007 | 6 | 900 | 2900
5 | shirt 001 | 2 | 750 | 1600
6 | hat 008 | 2 | 300 | 600
輸出
ID | productName | QTY
1 | dress 007 | 4
2 | shirt 001 | 2
3 | dress 007 | 1
4 | dress 007 | 1
5 | shirt 001 | 3
結果應該是
productName | SUM(QTY)INPUT | productName | SUM(QTY)OUTPUT
dress 007 | 18 | dress 007 | 6
shirt 001 | 6 | shirt 001 | 5
hat 008 | 2 | null | null
當只有一張表時,很容易執行 SUM 和 GROUP,但是當我嘗試按 productName LEFT JOIN 兩個表和 GROUP 時,我得到了錯誤的 SUM 值。 我錯在哪里?
容易的部分:
SELECT a.productName , SUM(a.QTY), a.buyPrice , a.sellPrice
FROM input a
GROUP BY a.productName
錯誤:
SELECT a.productName , SUM(a.QTY), b.productName , SUM(b.QTY)
FROM input a LEFT JOIN output b
ON a.productName = b.productName
GROUP BY a.productName
您可以使用union all
:
SELECT IF(sum(input) , productName, null) productName, sum(input) input,
IF(sum(output), productName, null) productName, sum(output) output
FROM (
SELECT productName, QTY input, null output
FROM input
UNION ALL
SELECT productName, null, QTY
FROM output
) as sub
GROUP BY productName
這甚至適用於您有產品輸出但沒有輸入的情況。 當數據涉及一個月內的交易時,可能會發生這種情況,比如說,一個月內的交易,但在該月初已經有股票。
我會在子查詢中進行聚合並加入它們。
SELECT input.productname,
input.quantity input_quantity,
output.quantity output_quantity
FROM (SELECT productname,
sum(qty) quantity
FROM input
GROUP BY productname) input
LEFT JOIN (SELECT productname,
sum(qty) quantity
FROM output
GROUP BY productname) output
ON output.productname = input.productname;
我認為union all
是要走的路。 我會做:
select productName, sum(input) as input_qty, sum(output) as output_qty
from ((select productName, qty as input, null as output
from input
) union all
(select productName, null, qty
from output
)
) io
group by productName;
請注意, productName
在結果集中只出現一次。 我認為沒有理由將它包含兩次。 如果沒有output
(或沒有input
)行,則對應的qty
將為NULL
。
歡迎來到 SO
有一種沒有子查詢的方法來實現這一點。 這是數學:)
由於您使用了 2 個表,因此您將得到乘以 ID 乘以產品的結果。 所以只需將總和除以產品名稱的數量除以與這些產品對應的唯一 ID :)
所以這樣的事情可以解決問題: Schema (MySQL v5.7)
CREATE TABLE INPUT (
`ID` INTEGER,
`productName` VARCHAR(9),
`QTY` INTEGER,
`buyPrice` INTEGER,
`sellPrice` INTEGER
);
INSERT INTO INPUT
(`ID`, `productName`, `QTY`, `buyPrice`, `sellPrice`)
VALUES
('1', 'dress 007', '2', '700', '1400'),
('2', 'shirt 001', '4', '800', '1900'),
('3', 'dress 007', '10', '700', '1500'),
('4', 'dress 007', '6', '900', '2900'),
('5', 'shirt 001', '2', '750', '1600'),
('6', 'hat 008', '2', '300', '600');
CREATE TABLE OUTPUT (
`ID` INTEGER,
`productName` VARCHAR(9),
`QTY` INTEGER
);
INSERT INTO OUTPUT
(`ID`, `productName`, `QTY`)
VALUES
('1', 'dress 007', '4'),
('2', 'shirt 001', '2'),
('3', 'dress 007', '1'),
('4', 'dress 007', '1'),
('5', 'shirt 001', '3');
查詢#1
SELECT I.productName,
SUM(I.QTY)/(COUNT(I.productName)/count(distinct I.ID))
as "SUM(QTY)INPUT",
O.productName,
SUM(O.QTY)/(COUNT(O.productName)/count(distinct O.ID))
as "SUM(QTY)OUTPUT"
FROM INPUT I
LEFT OUTER JOIN OUTPUT O ON I.productName = O.productName
GROUP BY I.productName
ORDER BY 2 DESC;
| productName | SUM(QTY)INPUT | SUM(QTY)OUTPUT | productName |
| ----------- | ------------- | -------------- | ----------- |
| dress 007 | 18 | 6 | dress 007 |
| shirt 001 | 6 | 5 | shirt 001 |
| hat 008 | 2 | null | null |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.