2016-07-19 32 views
0

Ich habe drei Tabellen: 1. speichert 2. fruchtig 3. vegetaMySQL LEFT JOIN Summe Count mit doppelten Zeilen

ich die stores Tisch sitzen hat gelassen, während die fruity und vegeta als Vereinigung.

Die Anzahl und die Summe muss ich gruppieren, durch die order_id und vendor_id, aber sie haben immer noch doppelte Zeilen. Hier

ist die Tabellen:

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 | 
+----+----------+-----------+----------+-------+ 

Der Code, den ich unten ausgeführt haben:

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; 

Ich brauche nur das Ergebnis wie unter diesen:

+----------+----------+-----------------+-----------+--------------+--------------+------------+------------+ 
| 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 | 
+----------+----------+-----------------+-----------+--------------+--------------+------------+------------+ 

Alles, was ich will Zu tun ist, die doppelten Zeilen zu verschieben, um die vegeta_count und vegeta_sum zu füllen. Keine neue Reihe zum Zählen machen.

Bitte helfen. Danke.

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

Antwort

0

Sie sollten group by in der äußeren Abfrage wie folgt verwendet werden:

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

+0

Es funktioniert. Vielen Dank! – cocksparrer