两个表SUM,GROUP

时间:2019-01-19 22:55:14

标签: mysql sql join sum

我有两个表,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

4 个答案:

答案 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

sqlfiddle

这甚至在产品有输出但无输入的情况下也可以使用。当数据涉及一个月(例如)一个月内的交易时,就可能发生这种情况,但是该月初已经有库存。

答案 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        |

https://www.db-fiddle.com/f/Dp7yaNkVf3JW2DZrrvL7G/1