簡體   English   中英

兩個表的 LEFT JOIN,SUM,GROUP

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

sqlfiddle

這甚至適用於您有產品輸出但沒有輸入的情況。 當數據涉及一個月內的交易時,可能會發生這種情況,比如說,一個月內的交易,但在該月初已經有股票。

我會在子查詢中進行聚合並加入它們。

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        |

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM