Я пишу несколько достаточно сложных запросов для отчетов по разрабатываемому приложению. Вероятно, я мог бы достичь всего следующего за счет использования 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
.
Любой совет будет принят. Пожалуйста, спросите, хотите ли вы, чтобы я уточнил подробнее.