MySql 合并多张表,按月对各部门全年销售额进行分组求和

MySql Group and sum sales by by month for each departments across the year joining multiple tables

我一直在努力实现以下目标,但无济于事。任何帮助将不胜感激。

部门 - 组织内的部门

id department_name
1 Process Consulting
2 Technical Consulting
3 Administrative Unit

服务 - 每个呈现的服务都映射到一个部门

id service_name department_id
1 Project management 1
2 Video production 2
3 Training 2
4 Facility Rental 3

事务 - 每个事务都映射到一个服务

id transaction_amount service_id transaction_date
1 2000 1 2021-02-04
2 3000 4 2021-01-01
3 1500 2 2021-03-14
4 3500 2 2021-03-20

我想达到的结果

department_id department_name year_summary (Jan - Dec separated by comma)
1 Process Consulting 0,2000,0,0,0,0,0,0,0,0,0,0
2 Technical Consulting 0,0,5000,0,0,0,0,0,0,0,0,0
3 Administrative Unit 3000,0,0,0,0,0,0,0,0,0,0,0

您似乎需要两个级别的条件聚合。第一个是按部门和月份汇总:

select d.id, d.department_name, month(transaction_date) as mon,
       sum(t.transaction_amount) as amount
from departments d left join
     services s
     on s.department_id = d.id left join
     transactions t
     on t.service_id = s.id  
where t.transaction_date >= '2021-01-01' and
      t.transaction_date < '2022-01-01'   
group by d.id, d.department_name;

第二个然后以您想要的格式聚合:

select id, department_name,
       concat_ws(',',
                 max(case when mon = 1 then amount else 0 end),
                 max(case when mon = 2 then amount else 0 end),
                 . . .   -- fill in the rest of the months
                 max(case when mon = 12 then amount else 0 end)
                ) as year_summary
from (select d.id, d.department_name, month(transaction_date) as mon,
             sum(t.transaction_amount) as amount
      from departments d left join
           services s
           on s.department_id = d.id left join
           transactions t
           on t.service_id = s.id  
      where t.transaction_date >= '2021-01-01' and
            t.transaction_date < '2022-01-01'   
      group by d.id, d.department_name
     ) dm
group by id, department_name;

虽然你已经得到了答案,但我在这里分享另一个,因为它已经准备好了:

架构和插入语句:

 create table Departments(id int, department_name varchar(100));
 insert into Departments values(1,  'Process Consulting');
 insert into Departments values(2,  'Technical Consulting');
 insert into Departments values(3,  'Administrative Unit');  
 
 create table Services (id int, service_name varchar(100), department_id int);
 insert into Services values(1, 'Project management',   1);
 insert into Services values(2, 'Video production'  ,   2);
 insert into Services values(3, 'Training'      ,   2);
 insert into Services values(4, 'Facility Rental'   ,   3);
 
 create table Transactions(id int, transaction_amount int, service_id int, transaction_date date);
 insert into Transactions values(1, 2000,   1,  '2021-02-04');
 insert into Transactions values(2, 3000,   4,  '2021-01-01');
 insert into Transactions values(3, 1500,   2,  '2021-03-14');
 insert into Transactions values(4, 3500,   2,  '2021-03-20');

查询(使用常见的 table 表达式和 group_concat() ):

 with Calendar as
   (
   SELECT 1 mon UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL
   SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL
   SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
   )
   , d as (select * from Calendar cross join Departments )
   , t as (select d.id,d.department_name ,month(transaction_date)mon, sum(transaction_amount)amountsum  from Departments d inner join Services s on d.id=s.department_id
 inner join Transactions t on s.id=t.service_id
 group by  d.id,d.department_name 
              )
              
 select d.id,d.department_name,group_concat(coalesce(amountsum,0) order by d.mon)  year_summary
 from d left join t on d.id=t.id and t.mon=d.mon
 group by d.id
              
              
              
   

输出:

id department_name year_summary
1 Process Consulting 0,2000,0,0,0,0,0,0,0,0,0,0
2 Technical Consulting 0,0,5000,0,0,0,0,0,0,0,0,0
3 Administrative Unit 3000,0,0,0,0,0,0,0,0,0,0,0

dbhere