Как развернуться в BigQuery?

# #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 — Если для уточнения вопроса требуется правка, прекрасно. Если правка существенно изменит вопрос и сделает ответ недействительным, это должен быть новый вопрос, а не правка.