Подзапрос SQL для получения итоговой суммы

Как с помощью подзапроса SQL получить общие позиции и общий доход для каждого менеджера, включая его команду? Предположим, у меня есть эта таблица items_revenue со столбцами: Подзапрос SQL для получения итоговой суммы

Все менеджеры (is_manager = 1) и их соответствующие члены указаны в таблице выше. Member1 находится под Manager1, Member2 находится под Manager2 и т. д., Но реальные данные расположены в случайном порядке.

Я хочу, чтобы мой запрос выводил ff .:

Подзапрос SQL для получения итоговой суммы

Это связано с SQL-запрос для получения промежуточного итога некоторых строк, но я не хочу использовать выражение CASE. Спасибо!

Вы можете скопировать это, чтобы легко создать таблицу:

DROP TABLE IF EXISTS items_revenue;
CREATE TABLE items_revenue (id int, is_manager int, manager_id int, name varchar(55), no_of_items int, revenue int);
INSERT INTO items_revenue (id, is_manager, manager_id, name, no_of_items, revenue)
VALUES
    (1  ,    1     ,    0     , 'Manager1' ,    621    ,   833), 
    (2  ,    1     ,    0     , 'Manager2' ,    458    ,   627),
    (3  ,    1     ,    0     , 'Manager3' ,    872    ,   1027 ),
    (8  ,    0     ,    1     , 'Member1'  ,    1258   ,   1582),
    (9  ,    0     ,    2     , 'Member2'  ,    5340   ,   8827),
    (10  ,    0     ,    3     , 'Member3'  ,    3259   ,   5124);

Поделитесь примерами таблиц / данных как таблиц на основе данных ascii, а не изображений.

Raymond Nijland 20.03.2018 12:46

есть только один уровень или есть несколько уровней?

Raymond Nijland 20.03.2018 12:50

@RaymondNijland, все менеджеры и их участники находятся в одной таблице.

Zhanrah 20.03.2018 12:56

Есть ли причина, по которой вы не хотите использовать выражение case?

Ilja Everilä 20.03.2018 12:57

«все менеджеры и их члены находятся в одном столе». Да, я понимаю, что это модель списка смежности (модель parent_id) .. Мне было интересно, где больше одного уровня иерархических уровней?

Raymond Nijland 20.03.2018 12:58

@RaymondNijland Нет, просто менеджер и участник.

Zhanrah 20.03.2018 13:32
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
6
200
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Используйте union all и агрегацию:

select manager_id, sum(no_of_items) as no_of_items, sum(revenue) as revenue
from ((select ir.manager_id, ir.no_of_items, ir.revenue
       from items_revenue ir
       where ir.is_manager = 0
      ) union all
      (select ir.id, ir.no_of_items, ir.revenue
       from items_revenue ir
       where ir.is_manager = 1
      )
     ) irm
group by manager_id;

Примечание: это касается только прямых подчиненных в таблице. Это образцы данных, которые вы предоставляете. Проблема существенно отличается, если вам нужны все прямые подчиненные, поэтому не меняйте этот вопрос для этой ситуации (задайте другой). Если вам это нужно, тогда MySQL - не лучший инструмент (если вы не используете версию 8), хотя вы можете решить эту проблему, если знаете максимальную глубину.

Используйте два подзапроса: один сгруппирован по id, где is_manager=1, а другой сгруппирован по manager_id, где is_manager=0.

SELECT id, name, 
       (t1.total_items + t2.total_items) total_items,
       (t1.total_revenue + t2.total_revenue) total_revenue
FROM (SELECT id, name, 
             sum(no_of_items) total_items, 
             sum(revenue) total_revenue
      FROM   items_revenue
      WHERE  is_manager = 1
      GROUP BY id, name) t1
JOIN (SELECT manager_id,
             sum(no_of_items) total_items, 
             sum(revenue) total_revenue
      FROM   items_revenue
      WHERE  is_manager = 0
      GROUP BY manager_id) t2
ON    t1.id = t2.manager_id;

Рекстестер здесь

SELECT
  employee.totalit + items_revenue.no_of_items,
  employee.totalerev + items_revenue.revenue,
  employee.manager_id
FROM (SELECT
        sum(no_of_items) AS totalit,
        sum(revenue) as totalerev,
        manager_id
      FROM items_revenue
      WHERE manager_id <> 0
      GROUP BY manager_id) AS employee, items_revenue
WHERE items_revenue.user_id = employee.manager_id;

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