Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос по вложенным запросам. / 5 сообщений из 5, страница 1 из 1
07.06.2018, 12:01
    #39657238
TatS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вложенным запросам.
Помогите, пожалуйста, решить задачку.

Есть 2 таблицы: Shippers - данные об отправителе и Orders - данные о заказах, с указанием кто отправил.
Нужно вывести тех отправителей, у которых количество заказов больше среднего и % у них от общего количества заказов.

Я еще только учусь и пытаюсь понять логику. Поэтому эти задачи разложила по частям:

1. Вывела тех отправителей, у которых количество заказов больше среднего:
SELECT sh.shippername, COUNT(o.orderid) AS total
FROM Shippers sh
JOIN Orders o ON sh.shipperid=o.shipperid
GROUP BY sh.shippername
HAVING COUNT(o.orderid)> (SELECT AVG(total)
from (
SELECT sh.shippername, COUNT(o.orderid) AS total
FROM Shippers sh
JOIN Orders o ON sh.shipperid=o.shipperid
GROUP BY sh.shippername)
AS dt);
+------------------+-------+
| shippername | total |
+------------------+-------+
| Federal Shipping | 68 |
| United Package | 74 |
+------------------+-------+
2 rows in set (0.00 sec)

2. Посчитала общее количество заказов (для дальнейшего расчета %)

SELECT COUNT(o.orderid) AS total
FROM Shippers sh
JOIN Orders o ON sh.shipperid=o.shipperid;
+-------+
| total |
+-------+
| 196 |
+-------+

3. Как сложить вместе, чтобы итоговая таблица имела вид:
+------------------+------------+--------+
| shippername | total | Quota |
+------------------+------------+--------+
| Federal Shipping | 68 | 34.69% |
| United Package | 74 | 37.76% |
+------------------+------------+--------+

SELECT sh.shippername, COUNT(o.orderid) AS total, CONCAT(COUNT(o.orderid)*100/ ??? , ' %') AS Quota
FROM Shippers sh
JOIN Orders o ON sh.shipperid=o.shipperid
GROUP BY sh.shippername
HAVING COUNT(o.orderid)> (SELECT AVG(total)
from (
SELECT sh.shippername, COUNT(o.orderid) AS total
FROM Shippers sh
JOIN Orders o ON sh.shipperid=o.shipperid
GROUP BY sh.shippername)
AS dt);

Вот как и куда впихнуть результат второго запроса?
...
Рейтинг: 0 / 0
07.06.2018, 12:36
    #39657293
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вложенным запросам.
TatSНужно вывести тех отправителей, у которых количество заказов больше среднего и % у них от общего количества заказов.Для того, чтобы получить требуемые данные для одного отправителя, нужно его количество заказов, общее количество заказов, и среднее. Эти три цифири нужно посчитать двумя разными подзапросами - первое в запросе 1, если выбросить HAVING, остальное в запросе 2. И вот теперь, используя эти запросы как подзапросы, считаете нужное.

Запрос 1. Назовем его query1.
Код: sql
1.
2.
3.
4.
SELECT sh.shippername, COUNT(o.orderid) AS total 
FROM Shippers sh 
JOIN Orders o ON sh.shipperid=o.shipperid 
GROUP BY sh.shippername


Запрос 2. Назовем его query2.
Код: sql
1.
2.
SELECT COUNT(orderid) / COUNT(shipperid) AS average, COUNT(orderid) AS total
FROM Orders



Составляем окончательный запрос, как будто имеем не подзапросы, а 2 таблицы. Получаем:

Код: sql
1.
2.
3.
SELECT query1.shippername, query1.total / query2.total * 100 as percent
FROM query1, query2
WHERE query1.total > query2.average



Подставляем подзапросы (сначала заменяем queryX на () AS queryX , потом в скобки вставляем текст подзапроса)
...
Рейтинг: 0 / 0
07.06.2018, 12:38
    #39657297
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вложенным запросам.
Подставляем подзапросы (сначала заменяем queryX на () AS queryX , потом в скобки вставляем текст подзапроса) и получаем окончательный запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT query1.shippername, query1.total / query2.total * 100 as percent
FROM ( SELECT sh.shippername, COUNT(o.orderid) AS total 
       FROM Shippers sh 
       JOIN Orders o ON sh.shipperid=o.shipperid 
       GROUP BY sh.shippername) AS query1
   , ( SELECT COUNT(orderid) / COUNT(shipperid) AS average, COUNT(orderid) AS total
       FROM Orders) AS query2
WHERE query1.total > query2.average
...
Рейтинг: 0 / 0
07.06.2018, 16:19
    #39657554
TatS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вложенным запросам.
Логику с запросами в виде таблиц поняла, спасибо.

SELECT query1.shippername as 'Sender', query1.total / query2.total * 100 as 'Quota'
FROM
( SELECT sh.shippername, COUNT(o.orderid) AS total
FROM Shippers sh
JOIN Orders o ON sh.shipperid=o.shipperid
GROUP BY sh.shippername) AS query1
, ( SELECT COUNT(orderid) / COUNT(shipperid) AS average, COUNT(orderid) AS total
FROM Orders) AS query2

WHERE query1.total > query2.average

По этому запросу выдает результат
+------------------+--------- +
| Sender | Quota |
+------------------+---------+
| Federal Shipping | 34.6939 |
| Speedy Express | 27.5510 |
| United Package | 37.7551 |
+------------------+---------+

Однако, требуется результат :
+------------------+------------+--------+
| shippername | total | Quota |
+------------------+------------+--------+
| Federal Shipping | 68 | 34.69% |
| United Package | 74 | 37.76% |
+------------------+------------+--------+

т.е. еще условие вывода тех, у кого total больше среднего
...
Рейтинг: 0 / 0
07.06.2018, 16:43
    #39657583
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по вложенным запросам.
TatSеще условие вывода тех, у кого total больше среднего
В запросе 2 - логическая ошибка. Он должен быть таким:
Код: sql
1.
2.
SELECT COUNT(orderid) / COUNT(DISTINCT shipperid) AS average, COUNT(orderid) AS total
FROM Orders

Внесите исправления.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос по вложенным запросам. / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]