MySQL左连接计数和重复行

时间:2016-07-19 08:41:32

标签: mysql count sum left-join union

我有三张桌子: 商店 果味 3. vegeta

我确实离开了stores表,fruityvegeta作为联盟。

我需要按order_id和vendor_id进行分组的计数和总和,但它们仍然有重复的行。

以下是表格:

mysql> SELECT * FROM stores;
+-----+-----------------+
| id  | store_name      |
+-----+-----------------+
| 701 | Machette Grill  |
| 702 | Mateau Conserva |
+-----+-----------------+

mysql> SELECT * FROM fruity;
+------+----------+-----------+----------+-------+
| id   | order_id | vendor_id | store_id | sales |
+------+----------+-----------+----------+-------+
| 1816 |       86 |         1 |      701 |  1000 |
| 1817 |       86 |        11 |      701 |  1000 |
| 1818 |       86 |        12 |      701 |  1000 |
| 1819 |       86 |         1 |      702 |  1000 |
| 1820 |       86 |         1 |      702 |  1000 |
| 1821 |       86 |        11 |      702 |  1000 |
| 1822 |       86 |        12 |      702 |  1000 |
| 1823 |       86 |         1 |      702 |  1000 |
| 1824 |       86 |         1 |      702 |  1000 |
| 1825 |       86 |         1 |      702 |  1000 |
| 1826 |       86 |        11 |      702 |  1000 |
| 1827 |       86 |        12 |      702 |  1000 |
| 1828 |       86 |         1 |      701 |  1000 |
+------+----------+-----------+----------+-------+

mysql> SELECT * FROM vegeta;
+----+----------+-----------+----------+-------+
| id | order_id | vendor_id | store_id | sales |
+----+----------+-----------+----------+-------+
| 15 |       86 |        11 |      701 |  2000 |
| 16 |       86 |        12 |      702 |  2000 |
| 17 |       86 |        11 |      701 |  2000 |
| 18 |       86 |        12 |      702 |  2000 |
| 19 |       86 |        11 |      701 |  2000 |
| 20 |       86 |        12 |      702 |  2000 |
+----+----------+-----------+----------+-------+

我在下面运行的代码:

SELECT
s.order_id,
s.store_id,
c.store_name,
s.vendor_id,
s.fruity_count,
s.vegeta_count,
s.fruity_sum,
s.vegeta_sum
FROM stores AS c
LEFT JOIN (
    SELECT
    order_id AS order_id,
    store_id AS store_id,
    vendor_id AS vendor_id,
    COUNT(sales) AS fruity_count,
    0 AS vegeta_count,
    SUM(sales) AS fruity_sum,
    0 AS vegeta_sum
    FROM fruity
    WHERE order_id = 86
    GROUP BY store_id,vendor_id
    UNION
    SELECT
    order_id AS order_id,
    store_id AS store_id,
    vendor_id AS vendor_id,
    0 AS fruity_count,
    COUNT(sales) AS vegeta_count,
    0 AS fruity_sum,
    SUM(sales) AS vegeta_sum
    FROM vegeta
    WHERE order_id = 86
    GROUP BY store_id,vendor_id) AS s ON s.store_id = c.id
WHERE s.order_id = 86
ORDER BY s.store_id ASC;

我只需要如下所示的结果:

+----------+----------+-----------------+-----------+--------------+--------------+------------+------------+
| order_id | store_id | store_name      | vendor_id | fruity_count | vegeta_count | fruity_sum | vegeta_sum |
+----------+----------+-----------------+-----------+--------------+--------------+------------+------------+
|       86 |      701 | Machette Grill  |         1 |            2 |            0 |       2000 |          0 |
|       86 |      701 | Machette Grill  |        11 |            1 |            3 |       1000 |       6000 |
|       86 |      701 | Machette Grill  |        12 |            1 |            0 |       1000 |          0 |
|       86 |      702 | Mateau Conserva |        12 |            2 |            3 |       2000 |       6000 |
|       86 |      702 | Mateau Conserva |         1 |            5 |            0 |       5000 |          0 |
|       86 |      702 | Mateau Conserva |        11 |            2 |            0 |       2000 |          0 |
+----------+----------+-----------------+-----------+--------------+--------------+------------+------------+

我想要做的就是移动重复的行来填充vegeta_countvegeta_sum。不计算新行。

请帮忙。 谢谢。

http://sqlfiddle.com/#!9/99387/1/0

1 个答案:

答案 0 :(得分:0)

您应该在外部查询中使用group by,如下所示:

SELECT
s.order_id,
s.store_id,
c.store_name,
s.vendor_id,
SUM(s.fruity_count) AS fruity_count,
SUM(s.vegeta_count) AS vegeta_count,
SUM(s.fruity_sum) AS fruity_sum,
SUM(s.vegeta_sum) AS vegeta_sum
FROM stores AS c
LEFT JOIN (
    SELECT
    order_id AS order_id,
    store_id AS store_id,
    vendor_id AS vendor_id,
    COUNT(sales) AS fruity_count,
    0 AS vegeta_count,
    SUM(sales) AS fruity_sum,
    0 AS vegeta_sum
    FROM fruity
    WHERE order_id = 86
    GROUP BY store_id,vendor_id
    UNION
    SELECT
    order_id AS order_id,
    store_id AS store_id,
    vendor_id AS vendor_id,
    0 AS fruity_count,
    COUNT(sales) AS vegeta_count,
    0 AS fruity_sum,
    SUM(sales) AS vegeta_sum
    FROM vegeta
    WHERE order_id = 86
    GROUP BY store_id,vendor_id) AS s ON s.store_id = c.id
WHERE s.order_id = 86
GROUP BY store_id,vendor_id
ORDER BY s.store_id ASC

SQLFiddle Demo