У меня есть следующий простой SQL-запрос, который мне нужно запустить на 3 таблицах:
SELECT
A.date,
SUM(A.number)
FROM A
GROUP BY
A.date
Но у меня есть две другие таблицы (B и C), для которых я хочу выполнить тот же запрос. И объедините результаты в одну таблицу в качестве вывода.
Я ожидаю, что вывод будет выглядеть примерно так:
Мы можем попробовать следующий подход к объединению:
SELECT
date,
SUM(CASE WHEN src = 'A' THEN number ELSE 0 END) AS A_sum,
SUM(CASE WHEN src = 'B' THEN number ELSE 0 END) AS B_sum,
SUM(CASE WHEN src = 'C' THEN number ELSE 0 END) AS C_sum
FROM
(
SELECT date, number, 'A' AS src FROM A
UNION ALL
SELECT date, number, 'B' FROM B
UNION ALL
SELECT date, number, 'C' FROM C
) t
GROUP BY date
ORDER BY date;
Вот мой подход:
Create Table TableA
(
Dates Date,
Number Int
)
GO
Create Table TableB
(
Dates Date,
Number Int
)
GO
Create Table TableC
(
Dates Date,
Number Int
)
GO
Insert Into TableA
Values ('2023-01-01', 100000),
('2023-01-02',30000)
GO
Insert Into TableB
Values ('2023-01-01', 200000),
('2023-01-02',10000)
GO
Insert Into TableC
Values ('2023-01-01', 400000),
('2023-01-02',20000)
GO
SELECT * from
(
Select *,'A' Det from TableA
UNION ALL
Select *,'B' from TableB
UNION ALL
Select *,'C' from TableC
)ABC
PIVOT
(SUM(ABC.Number) FOR Det IN (A,B,C))
XYZ
DROP TABLE TableA
DROP Table TableB
DROP table TableC
Ааа... Извините, я неправильно понял это требование, спасибо за его уточнение.
Лучший вариант IMO - сначала создать календарь, а затем оставить созданный календарь с разными таблицами:
Календарь важен для сбора данных из соединения.
И это довольно странно, если у вас есть дата столбца как год. На мой взгляд, это небольшой уровень сложности.
Но ладно. Допустим, у вас есть только год.
Создайте таблицу с годами.
Create Table Years
(
years int
)
следующий:
INSERT INTO Years(years )
VALUES
(2022),(2021),(2020),(2019),(2018),(2017),(2016),(2015)
например.
SELECT
y.*,
sum(a.number) as SumA,
sum(b.number) as SumB,
sum(c.number) as SumC
FROM Years as y
left join
table_a a
on
y.years=a.date
left join
table_b b
on
y.years=b.date
left join
table_c c
on
y.years=c.date
GROUP BY
y.years
Надеюсь, это поможет!
Пожалуйста, дайте мне знать, если это работает, как вы хотели.
Вы уверены, что Amazon Athena поддерживает
PIVOT
?