我有两个表,INPUT和OUTPUT。
具有列ID,productName,QTY,buyPrice,sellPrice的INPUT表。 列ID,productName,QTY的OUTPUT表。 两者都可以具有具有相同productName和不同(或相同)数量的多个输入。 OUTPUT不能具有未在INPUT表中首先出现的productName。
我正在尝试查询两个表并获取最终结果-像这样: productName,INPUT表中的SUM(QTY)(按productName分组),productName,OUTPUT中的SUM(QTY)(按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左联接两个表和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
答案 0 :(得分:1)
您可以使用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
这甚至在产品有输出但无输入的情况下也可以使用。当数据涉及一个月(例如)一个月内的交易时,就可能发生这种情况,但是该月初已经有库存。
答案 1 :(得分:0)
我将在子查询中进行汇总并将其加入。
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;
答案 2 :(得分:0)
我认为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
。
答案 3 :(得分:0)
欢迎来到
有一种无需子查询即可实现的方法。这是数学的:)
由于您进入了2张桌子,因此得到的结果将乘以ID和乘积。因此,只需将总和除以产品名称的计数再除以与这些产品相对应的唯一ID:)
因此,类似这样的方法将达到目的: 模式(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 |