MySQL расширенный повтор запросов - PullRequest
1 голос
/ 12 июля 2011

Я пишу несколько достаточно сложных запросов для отчетов по разрабатываемому приложению. Вероятно, я мог бы достичь всего следующего за счет использования PHP более высокого уровня, но, очевидно, я бы хотел, чтобы все это было сделано с MySQL, что, очевидно, значительно упростит ситуацию.

Нужный мне отчет - это типичный запрос типа отчета о продажах, в котором будет указан список людей и некоторые соответствующие итоги, относящиеся к ним. Единственное незначительное отличие состоит в том, что эта система относится к грузоперевозкам, поэтому «продавцы» на самом деле являются водителями грузовиков, а «продажи» - это отдельные партии. Кроме того, грузы связываются / привязываются к соответствующему водителю только путем создания «маршрутов», в которых указывается, кто что доставляет / собирает в определенный день.

Естественно, я мог бы использовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ, чтобы получить список каждого водителя, со всеми отправленными / полученными партиями и СУММОМ доходом, полученным от них. Проблема возникает, однако, когда мне нужно показать оба столбца для общего дохода от доставки и дохода от сбора . Эти цифры могут быть взяты из таблицы партий , в которой перечислены все партии. Каждая партия может иметь флаг (ENUM "D", "C"), который указывает, является ли это доставкой или сбором. Это можно легко определить с помощью подзапросов, но повторений будет много.

Что у меня так далеко:

SELECT pr.driver_callsign, d.first_name, d.last_name, sum(pc.revenue) AS total_revenue
FROM pallet_routes AS pr
INNER JOIN drivers AS d ON d.driver_callsign = pr.driver_callsign
INNER JOIN pallet_consignments AS pc ON pc.route_id = pr.route_id
GROUP BY pr.driver_callsign
ORDER BY d.driver_callsign ASC

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

Каков наиболее эффективный способ дальнейшего разделения этого поля revenue SUM до значений SUM(revenue) WHERE type = "C" и SUM(revenue) WHERE type="D"? Подзапросы? UNION

Также стоит упомянуть, что конечный запрос будет сужен до диапазона дат. Так, например, в таблицу pallet_routes будет положено WHERE date BETWEEN x AND y.

Любой совет будет принят. Пожалуйста, спросите, хотите ли вы, чтобы я уточнил подробнее.

1 Ответ

1 голос
/ 12 июля 2011

Я не знаю, где находится ваш столбец type, но если он на pallet_consignments, вы можете попробовать следующее:

SELECT pr.driver_callsign, d.first_name, d.last_name, 
SUM(IF(pc.`type` = 'C', pc.revenue, 0)) collection_revenue,
SUM(IF(pc.`type` = 'D', pc.revenue, 0)) delivery_revenue
FROM pallet_routes AS pr
INNER JOIN drivers AS d ON d.driver_callsign = pr.driver_callsign
INNER JOIN pallet_consignments AS pc ON pc.route_id = pr.route_id
GROUP BY pr.driver_callsign
ORDER BY d.driver_callsign ASC

В противном случае, пожалуйста, укажите, где находится столбец type.

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