Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Объединение запросов, оператор Union

SKRE}I{ET Знаток (398), на голосовании 3 года назад
Всем привет, для саморазвития я занялся изучением языка sql запросов, при применении postgresql. Решил начать свою путь в этом захватывающем обучении с sql-academy.org.
На завершающем задании второго этапа я оказался в тупике, и ни кто не может мне подсказать, что я делаю не так, и как решить эту задачу. Искал помощи на форуме, но содержательного ответа не получил. Прошу содействия в решении задачи.
Текст задачи, запрос и результат, который поучился у меня и которого нужно достичь на скрин-шоте, приложенном к этому сообщению. Также, ниже продублировал свой запрос в печатном формате.
Не могу понять, что нужно дописать в запросе. Помогите решить задачу.

WITH report
AS (
SELECT
FamilyMembers.member_name,
FamilyMembers.status,
Goods.good_name,
SUM (Payments.amount * Payments.unit_price) AS costs
FROM FamilyMembers
INNER JOIN Goods ON FamilyMembers.member_id = Goods.good_id
INNER JOIN Payments ON FamilyMembers.member_id = Payments.payment_id
WHERE FamilyMembers.member_name LIKE '%Quincey' AND
Payments.date > '2005-06-01' AND Payments.date < '2005-10-01'
GROUP BY FamilyMembers.member_id)
--ORDER BY member_name ASC)
SELECT * FROM report
UNION
SELECT
member_name =NULL, --можно просто NULL --
STATUS =NULL, --можно просто NULL --
"Total:",
(SELECT DISTINCT SUM(costs) FROM report )
FROM report
ORDER BY CASE WHEN member_name IS NULL THEN 1 ELSE 0 END,member_name ASC, costs DESC

Голосование за лучший ответ
Sergey V. Voronin Искусственный Интеллект (292237) 3 года назад
разное кол-во полей в объединяемых
SKRE}I{ETЗнаток (398) 3 года назад
По 4 поля
Sergey V. Voronin Искусственный Интеллект (292237) SKRE}I{ET, А, не заметил. А ошибка-то какая? Выполняйте запросы пофрагментно, как все начали работать, делайте юнион.
SKRE}I{ETЗнаток (398) 3 года назад
В том, то и дело, что по сути я сделал все условия кроме сортировки первых двух позиций по убыванию и не знаю, как этого добиться, так как DESC прописан, на мой взгляд, там где нужно. Либо 'total:' улетает в самый верх.
Sergey V. Voronin Искусственный Интеллект (292237) SKRE}I{ET, Сортировка делается в конце. Можно добавть служебное поле для сортировки тотала в конец.
Антон Машутов Ученик (108) 2 года назад
WITH report
AS (
SELECT member_name,
status,
good_name,
Payments.amount * Payments.unit_price AS costs
FROM FamilyMembers
inner JOIN payments
on member_id = family_member and member_name like '% Quincey' and date >= '2005-07-01'and date <= '2005-09-30'
inner JOIN Goods
on good = good_id
ORDER BY member_name
)
SELECT * FROM report
UNION
SELECT
member_name =NULL, -- можно просто NULL --
STATUS =NULL, -- можно просто NULL --
"Total:",
(SELECT DISTINCT SUM(costs) FROM report )
FROM report
ORDER BY CASE WHEN member_name IS NULL THEN 1 ELSE 0 END,member_name ASC, costs DESC
Данил Жданов Ученик (150) 1 год назад
Не знаю,насколько это актуально сейчас,но может другим поможет

with report as (
select member_name,
status,
good_name,
sum(amount*unit_price) costs
from FamilyMembers fm
join Payments p on fm.member_id=p.family_member
join goods g on g.good_id=p.good
where date between '2005-07-01' and '2005-09-30'
group by family_member,good_name

)


select * from report
union
select
member_name=null,
status=null,
'Total:', (SELECT SUM(costs) FROM report ) costs
FROM report
ORDER BY CASE WHEN member_name IS NULL THEN 1 ELSE 0 END,member_name ASC, costs DESC
Похожие вопросы