繁体   English   中英

SQL JOIN, GROUP BY 在四个表上按月获取记录

[英]SQL JOIN, GROUP BY on Four tables to get Record By Month

我有以下数据库设计。 表是:

auth_user
----------
first_name
last_name

staffuser
----------
phone_number
user_id

billing_customerservicebill
-----------------------------
bill_id
service_provider_id
discounted_price

billing_billmanagement
------------------------
creation_date

我的查询按月行明智地返回每个用户的折扣价格总和。 我需要在列中显示每个月的记录。 以下查询给了我这条记录

select a.service_provider_id, first_name, Sum(a.discounted_price), EXTRACT(MONTH FROM c.creation_date)
    from billing_customerservicebill a
         left outer join users_staffuser b
         on a.service_provider_id = b.id
         left outer join billing_billmanagement c
         on a.bill_id = c.id
         left outer join auth_user d 
         on d.id = b.user_id
    where c.creation_date between '2017-11-01' AND '2017-12-31'
    group by service_provider_id, first_name, EXTRACT(MONTH FROM c.creation_date)
    order by 1

My data show in Table Currently 
    service_provider_id | first_name | Sum     |  Month
      5                 |   suneel     31500   |  11
      5                 |   Suneel   | 900     |  12

Expected data is 
    service_provider_id | first_name | Nov     |  December
      5                 |   suneel   |  31500  |  900

最灵活的方法是使用条件聚合...

select
    a.service_provider_id,
    first_name,
    SUM(CASE WHEN c.creation_date >= '2017-11-01' AND c.creation_date < '2017-12-01' THEN a.discounted_price END)   AS nov,
    SUM(CASE WHEN c.creation_date >= '2017-12-01' AND c.creation_date < '2018-01-01' THEN a.discounted_price END)   AS dec
from billing_customerservicebill a
     left outer join users_staffuser b
     on a.service_provider_id = b.id
     left outer join billing_billmanagement c
     on a.bill_id = c.id
     left outer join auth_user d 
     on d.id = b.user_id
where c.creation_date between '2017-11-01' AND '2017-12-31'
group by service_provider_id, first_name
order by 1

这表明您需要提前知道要计算哪些列。

请尝试使用以下解决方案,它接近您的答案:月份作为列并按用户分组:

select  B.service_provider_id, B.first_name, 
(case when month=1 then discounted_price else 0 end) as JAN, 
(case when month=2 then discounted_price else 0 end) as FEB, 
(case when month=3 then discounted_price else 0 end) as MAR, 
(case when month=4 then discounted_price else 0 end) as APR, 
(case when month=5 then discounted_price else 0 end) as MAY, 
(case when month=6 then discounted_price else 0 end) as JUN, 
(case when month=7 then discounted_price else 0 end) as JULY, 
(case when month=8 then discounted_price else 0 end) as AUG, 
(case when month=9 then discounted_price else 0 end) as SEP, 
(case when month=10 then discounted_price else 0 end) as OCT, 
(case when month=11 then discounted_price else 0 end) as NOV, 
(case when month=12 then discounted_price else 0 end) as DEC 
from(
select a.service_provider_id, first_name, Sum(a.discounted_price) as discounted_price, EXTRACT(MONTH FROM c.creation_date) as month
    from billing_customerservicebill a
         left outer join users_staffuser b
         on a.service_provider_id = b.id
         left outer join billing_billmanagement c
         on a.bill_id = c.id
         left outer join auth_user d 
         on d.id = b.user_id
    where c.creation_date between '2017-11-01' AND '2017-12-31'
    group by service_provider_id, first_name, EXTRACT(MONTH FROM c.creation_date)    
) as B
group by B.service_provider_id, B.first_name

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM