Сумма продаж по стране, штату, городу и району из пяти таблиц Mysql - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть пять таблиц ниже, я хочу показать сумму продаж по стране, штату, городу и району, используя один запрос mysql, если это возможно:

примечание: если в штате, городе, районе нет продаж, тогда мне нужен результат запроса, чтобы показать 0 или пустое место (название штата, города, района должно отображаться, даже если для этого нет продаж) конкретный штат, город или район)

+------------+----------+
|  country              |
+------------+----------+
| country_id | country  |
+------------+----------+
| 1          | country1 |
| 2          | country2 |
+------------+----------+


+----------------+--------+------------+
| state_province                       |
+----------------+--------+------------+
| state_id       | state  | country_id |
+----------------+--------+------------+
| 1              | state1 | 1          |
| 2              | state1 | 2          |
| 3              | state2 | 2          |
| 4              | state2 | 1          |
+----------------+--------+------------+


+---------+-------+----------+
|  city                      |
+---------+-------+----------+
| city_id | city  | state_id |
+---------+-------+----------+
| 1       | city1 | 1        |
| 2       | city2 | 1        |
| 3       | city1 | 3        |
| 4       | city2 | 3        |
| 5       | city1 | 4        |
| 6       | city2 | 4        |
+---------+-------+----------+

обратите внимание, что штат (state_id = 2) в стране (country_id = 2) не имеет городов в таблице выше.

+-------------+-----------+---------+
|  district                         |
+-------------+-----------+---------+
| district_id | district  | city_id |
+-------------+-----------+---------+
| 1           | district1 | 1       |
| 2           | district2 | 1       |
| 3           | district1 | 2       |
| 4           | district2 | 2       |
| 5           | district1 | 4       |
| 6           | district2 | 4       |
| 7           | district1 | 5       |
| 8           | district1 | 6       |
+-------------+-----------+---------+


+----------+------------+----------+---------+-------------+--------+
|  sales                                                            |
+----------+------------+----------+---------+-------------+--------+
| sales_id | country_id | state_id | city_id | district_id | amount |
+----------+------------+----------+---------+-------------+--------+
| 1        | 1          | 0        | 0       | 0           | 1000   |
| 2        | 1          | 0        | 0       | 0           | 2000   |
| 3        | 1          | 1        | 0       | 0           | 300    |
| 4        | 1          | 1        | 0       | 0           | 70     |
| 5        | 1          | 1        | 1       | 0           | 50     |
| 6        | 1          | 1        | 1       | 1           | 25     |
| 7        | 1          | 4        | 1       | 1           | 25     |
| 8        | 1          | 4        | 5       | 0           | 25     |
| 9        | 2          | 0        | 0       | 0           | 3000   |
| 10       | 2          | 0        | 0       | 0           | 500    |
| 11       | 2          | 3        | 0       | 0           | 300    |
| 12       | 2          | 3        | 4       | 6           | 70     |
+----------+------------+----------+---------+-------------+--------+

Демо с моей текущей попыткой

Спасибо

1 Ответ

0 голосов
/ 01 сентября 2018

Если вы хотите сгруппировать по трем столбцам (city_id, state_id, district_id), это бессмысленно, поскольку ничего не изменится в вашей таблице sales. Там вы уже разделили информацию.

Более того, в таблице sales вместо идентификаторов у вас 0, а в таблице нет идентификаторов, равных 0. Вам нужно переосмыслить то, что вы действительно хотите, я думаю.

Я думаю, вам просто нужно присоединиться:

SELECT country,
       state,
       city,
       district,
       coalesce(amount, 0) amount
FROM country ctr
JOIN state_province st ON ctr.country_id = st.country_id
JOIN city c ON c.state_id = st.state_id
LEFT JOIN district d ON d.city_id = c.city_id
LEFT JOIN sales s ON
    s.country_id = ctr.country_id AND
    s.state_id = st.state_id AND
    s.city_id = c.city_id AND
    s.district_id = d.district_id

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...