[英]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.