Группировать по нескольким вложенным полям и возвращать результат в BigQuery

У меня есть данные о супермаркете, и я хочу перечислить все филиалы супермаркетов в городе, а затем все отделы этого супермаркета, такие как продуктовый магазин, косметика. Составьте список продаж для каждого отдела и, наконец, рассчитайте общий объем продаж в каждом отделе. Поэтому мой ответ должен выглядеть примерно так, как показано ниже.

Ветвь Отделение Элемент Общая сумма 1 Бакалея Рис 150 Пшеница 200 Косметика Крем 300 Пудра 100 2 Бакалея Масло 400 Даль 200 Косметика сыворотка 150 Шампунь 100

Я попробовал приведенный ниже запрос

SELECT branch, department, item , totalAmt
   FROM project.dataset.table 
   GROUP BY branch, department
   ORDER BY branch, department limit 100

Но это дает результат, как показано ниже:

Ветвь Отделение Элемент Общая сумма 1 Бакалея Рис 150 1 Бакалея Пшеница 200 1 Косметика Крем 300 1 Косметика Пудра 100 2 Бакалея Масло 400 2 Бакалея Даль 200 2 Косметика сыворотка 150 2 Косметика Шампунь 100

Можно ли сгруппировать по филиалу и внутри этого отдела и получить результаты, подобные тем, что в первой таблице, с помощью BigQuery?

Каков ваш ожидаемый результат? @Кришна

Art Bindu 24.07.2024 08:20

Мой ожидаемый результат - это первая таблица в вопросе, где она группируется по филиалам, а затем внутри нее группируется по отделам и отображает результат @ArtBindu.

krishna 24.07.2024 08:24

Форматирование вывода должно выполняться в графическом интерфейсе приложения, а не в коде sql. Вы ожидаете от реляционной базы данных чего-то, чего она не может сделать очень просто. Пожалуйста, не добавляйте к своему вопросу случайные несвязанные теги.

Shadow 24.07.2024 08:38

Вы на 100% уверены, что результатом запроса у вас является вторая таблица? Для меня это не имеет никакого смысла, поскольку в инструкции SELECT есть 3 столбца. Содержимое третьего столбца на основе вашего запроса должно быть примерно таким: [{"item": "itemA", "totalAmt": 100}, {"item": "itemB", "totalAmt": 200}]

Alvaro 24.07.2024 09:36

По мнению БД, это глупый вопрос ... @krishna

Art Bindu 24.07.2024 12:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте функции array_agg и struct после суммирования, чтобы получить общую сумму в подзапросе. См. ниже

создать образец набора данных

WITH ProductData AS (
    SELECT 1 AS branch, 'Grocery' AS department, 'Rice' AS item, 150 AS Value UNION ALL
    SELECT 1, 'Grocery', 'Wheat', 200 UNION ALL
    SELECT 1, 'Cosmetics', 'Cream', 300 UNION ALL
    SELECT 1, 'Cosmetics', 'Powder', 100 UNION ALL
    SELECT 2, 'Grocery', 'Oil', 400 UNION ALL
    SELECT 2, 'Grocery', 'Dal', 200 UNION ALL
    SELECT 2, 'Cosmetics', 'Serum', 150 UNION ALL
    SELECT 2, 'Cosmetics', 'Shampoo', 100 union all
     SELECT 1, 'Grocery', 'Wheat', 99 UNION ALL
    SELECT 1, 'Cosmetics', 'Cream', 33 UNION ALL
    SELECT 1, 'Cosmetics', 'Powder', 11 UNION ALL
    SELECT 2, 'Grocery', 'Oil', 44 UNION ALL
    SELECT 2, 'Grocery', 'Dal', 22 UNION ALL
    SELECT 2, 'Cosmetics', 'Serum', 15 UNION ALL
    SELECT 2, 'Cosmetics', 'Shampoo', 13
)

чтобы получить желаемые результаты

SELECT branch, 
       department,
       ARRAY_AGG(STRUCT(item AS item, total_amt AS amount)) AS items
FROM (
    SELECT branch, department, item, SUM(value) AS total_amt
    FROM ProductData
    GROUP BY branch, department, item
)

ГРУППА ПО филиалу, отделу ЗАКАЗАТЬ ПО филиалу, отделу;

Результаты

Другие вопросы по теме