# #sql #google-bigquery
Вопрос:
Я выполняю проверки между исходными таблицами и целевыми таблицами в разных процессах в озере данных.
Я работаю со StandardSQL в BigQuery и провожу сравнения между обеими таблицами с помощью этого запроса:
SELECT
SALESDATE
,'table_destination_Y - table_source_X' PROCESS
,'SOURCE' TABLE
,SUM(SALESMNT) SALESMNT
,SUM(SALESQTY) SALESQTY
,COUNT(DISTINCT TRX) COUNTTRX
FROM data-set.table_source_X
WHERE <CONDITIONS>
GROUP BY SALESDATE
UNION ALL
SELECT
SALESDATE
,'table_destination_Y - table_source_X' PROCESS
,'DESTINY' TABLE
,SUM(SALESMNT) SALESMNT
,SUM(SALESQTY) SALESQTY
,COUNT(DISTINCT TRX) COUNTTRX
FROM data-set.table_destination_Y
GROUP BY SALESDATE
И вот результат:
Есть ли способ нормализовать и денормализовать эту информацию следующим образом?
Мне нужно оценить несколько процессов, которые имеют больше или меньше показателей, и мне нужно будет повернуть запрос, чтобы сравнить его более легко и стандартизированным способом для всех процессов.
Спасибо и с уважением.
ОБНОВЛЕНИЕ: Без создания таблиц или представлений. Мне нужно, чтобы это было с запросом.
Обновление 2:
В случае оценки 3 или более таблиц мне понадобится запрос, чтобы иметь возможность присоединиться к столбцу процесса (с именем таблицы) в соответствии с оцененными показателями.
SELECT
SALESDATE
,'table_destination_Y' PROCESS
,'DESTINATION' TABLE
,SUM(SALESMNT) SALESMNT
,SUM(SALESQTY) SALESQTY
,COUNT(DISTINCT TRX) COUNTTRX
,SUM(SALESCOST) SALESCOST
FROM data-set.table_destination_Y
GROUP BY SALESDATE
UNION ALL
SELECT
SALESDATE
,'table_source_X' PROCESS
,'SOURCE' TABLE
,SUM(SALESMNT) SALESMNT
,SUM(SALESQTY) SALESQTY
,COUNT(DISTINCT TRX) COUNTTRX
,0
FROM data-set.table_source_X
WHERE <CONDITIONS>
GROUP BY SALESDATE
UNION ALL
SELECT
SALESDATE
,'table_source_Z'
,'SOURCE'
,0
,0
,0
,SUM(SALESCOST) SALESCOST
FROM data-set.table_source_Z
WHERE <CONDITIONS>
GROUP BY SALESDATE
Это будет результатом предыдущего запроса:
и это должно быть результатом:
Возможно ли это?
Спасибо и с уважением.
Ответ №1:
Используйте ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ для «разнесения» строк, чтобы у вас была строка для каждой меры.
Используйте «условное агрегирование», чтобы «свернуть» пары строк в одну строку с двумя столбцами.
SELECT
src.SALESDATE,
src.PROCESS,
pvt.MEASURE,
MAX(
CASE
WHEN src.TABLE != 'SOURCE' THEN NULL
WHEN pvt.MEASURE = 'SALESMNT' THEN src.SALESMNT
WHEN pvt.MEASURE = 'SALESQTY' THEN src.SALESQTY
WHEN pvt.MEASURE = 'COUNTTRX' THEN src.COUNTTRX
END
)
AS SOURCE,
MAX(
CASE
WHEN src.TABLE != 'DESTINATION' THEN NULL
WHEN pvt.MEASURE = 'SALESMNT' THEN src.SALESMNT
WHEN pvt.MEASURE = 'SALESQTY' THEN src.SALESQTY
WHEN pvt.MEASURE = 'COUNTTRX' THEN src.COUNTTRX
END
)
AS DESTINATION
FROM
(
yourQuery
)
AS src
CROSS JOIN
(
SELECT 'SALESMNT' AS MEASURE
UNION ALL
SELECT 'SALESQTY'
UNION ALL
SELECT 'COUNTTRX'
)
AS pvt
GROUP BY
src.SALESDATE,
src.PROCESS,
pvt.MEASURE
Комментарии:
1. Отлично, это работает! Спасибо за быстрый ответ. Извините за настойчивость, но я уточняю вопрос, потому что понял, что требуется еще одно преобразование.
2. @RicardoCarrera — Если для уточнения вопроса требуется правка, прекрасно. Если правка существенно изменит вопрос и сделает ответ недействительным, это должен быть новый вопрос, а не правка.