MySQL объединяет несколько запросов для отчета - PullRequest
0 голосов
/ 19 декабря 2018

См. SQLFiddle здесь: http://sqlfiddle.com/#!9/9bb273

Мне нужно создать отчет из 3 запросов.Это должен быть один запрос без подзапросов (из-за ограничений ORM).

Основной запрос:

SELECT SQL_CALC_FOUND_ROWS 
Organization.name as organization_name, 
Program.unique_id as program_uuid, 
Program.name as program_name,
Program.start_date,
Program.end_date,
Program.grace_period,
'Placeholder A' as 'Participant Count',
'Placeholder B' as 'Total Participant Points',
count(distinct Transaction.id) as 'Transaction Count',
sum(TransactionItem.quantity) as 'Total Redemptions',
sum(((TransactionProduct.retail + IFNULL(TransactionProduct.shipping,0) + IFNULL(TransactionProduct.handling,0)) * TransactionItem.quantity)) as 'Total'
FROM `TransactionItem` 
JOIN `Transaction` ON `Transaction`.id = `TransactionItem`.transaction_id 
JOIN `TransactionProduct` ON `TransactionItem`.reference_id = `TransactionProduct`.reference_id 
JOIN `Participant` ON `Transaction`.participant_id = `Participant`.id 
JOIN `Program` ON `Program`.id = `Participant`.program_id 
JOIN `Organization` ON `Organization`.id = `Participant`.organization_id 
WHERE 1=1  
AND `Organization`.`unique_id` = 'demo2' 
AND `Program`.`unique_id` = 'demo2' 
AND `Transaction`.`created_at` >= '2018-10-01 00:00:00' 
AND `Transaction`.`created_at` <= '2018-12-18 00:00:00';

Как видите, этот отчет для диапазона дат между 10/1 и 12/18.Результирующий набор, составляющий отчет: ...

organization_name | program_uuid | program_name | start_date | end_date | grace_period | Participant Count | Total Participant Points | Transaction Count | Total Redemptions | Total
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Demo2 Org           demo2          Demo2          2018-10-01   2018-12-27  5             Placeholder A       Placeholder B              11                   92                 2853.13

Как видите, есть 2 точки данных, которые я не могу получить из этого запроса.

(1) Общее количество участников программы «demo2».Этот запрос получает эту точку данных.

/* Placeholder A */
select program_id, count(*) as 'Participant Count' from participant 
where active = 1
group by program_id;

Возвращает:

program_id   |  Participant Count
----------------------------------
2               102

(2) Сумма Adjustments.amount для всех строк между датами 10/1 и 12/18.Этот запрос выполняет это.

/* Placeholder B */
select sum(amount) as 'Total Particpant Points' from adjustment 
where participant_id in (select id from participant where program_id =2)
and type = 1
and created_at >= '2018-10-01 00:00:00' and created_at <= '2018-12-18 00:00:00';

Возвращает:

 Total Participant Points
 ------------------------
 10000.50000

Есть ли способ собрать все эти данные в одном запросе без подзапросов?

...