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

Все менеджеры (is_manager = 1) и их соответствующие члены указаны в таблице выше. Member1 находится под Manager1, Member2 находится под Manager2 и т. д., Но реальные данные расположены в случайном порядке.
Я хочу, чтобы мой запрос выводил ff .:
Это связано с 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);
есть только один уровень или есть несколько уровней?
@RaymondNijland, все менеджеры и их участники находятся в одной таблице.
Есть ли причина, по которой вы не хотите использовать выражение case?
«все менеджеры и их члены находятся в одном столе». Да, я понимаю, что это модель списка смежности (модель parent_id) .. Мне было интересно, где больше одного уровня иерархических уровней?
@RaymondNijland Нет, просто менеджер и участник.






Используйте 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;
Поделитесь примерами таблиц / данных как таблиц на основе данных ascii, а не изображений.