简体   繁体   English

如何按前六个月的字段名称按月总计

[英]How to sum total by a field name by month for the previous six month

I have a table with following fields Status, branch, reason code description, year, month, day, count 我有一个包含以下字段的表:状态,分支,原因代码描述,年,月,日,计数

I am trying to get a report like this for each branch: 我正在尝试为每个分支获取这样的报告:

Reason code desc.,July,August,sept.,October.,nov.,Dec.,Total,% of Total

Reason 1.   4. 6. 2. 5. 0. 2. 19  79.1
Reason 2.   1  0. 2. 1. 1. 0   5.  20.9
            --------------------------
            5. 6. 4. 6. 1. 2. 24  100.0

Assuming that your database is Oracle the query can be: 假设您的数据库是Oracle,则查询可以是:

 select RCMonth.*, RCTotal.Total, round(RCTotal.Total*100/Total.Total, 2) "Total%" 
 from 
 (
 select reasoncode , to_char(createdon,'Mon') mon
 from rc_report 
 where createdon > sysdate - 180 
 union all
 select 'Sum' , to_char(createdon,'Mon') mon
 from rc_report 
 where createdon > sysdate - 180 
 ) pivot 
 ( count(*) 
    for mon in ('Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Jan')
 ) RCMonth
 join ( select count(*) Total,
         reasoncode 
        from rc_report
        where createdon > sysdate - 180 
        group by reasoncode
        union all
        select count(*) Total,
         'Sum'
        from rc_report
        where createdon > sysdate - 180 
        ) RCTotal
  on RCTotal.ReasonCode = RCMonth.ReasonCode
 cross join  (
 select count(*) Total
        from rc_report
        where createdon > sysdate - 180 ) Total 
    order by RCMonth.ReasonCode

Sample result is: 样本结果是:

Row#    REASONCODE  'Aug'   'Sep'   'Oct'   'Nov'   'Dec'   'Jan'   TOTAL   Total%

1       Reason1       2       2      0       3        2      0      9       81.82
2       Reason2       0       1      0       1        0      0      2       18.18
3       Sum           2       3      0       4        2      0      11      100

Table definition is : 表的定义是:

create table rc_report
(reasoncode varchar2(20),
 createdon date)

And also version for SQL Server in SQL Fiddle It's only a little bit different. 以及SQL Fiddle中 SQL Server的版本只是有些不同。

select RCMonth.*, RCTotal.Total, round( cast ( RCTotal.Total as decimal) *100 /Total.Total,2) "Total%" 
 from 
 (
    select reasoncode, [Aug], [Sep], [Oct], [Nov], [Dec], [Jan]   from (
select reasoncode , left( datename(Month,createdon),3) mon
 from rc_report 
 where createdon >= DATEADD(MONTH, -6, GETDATE())
  union all
 select 'Sum' , left( datename(Month, createdon),3) mon
 from rc_report 
 where createdon  >= DATEADD(MONTH, -6, GETDATE())
 ) Source
  pivot 
 ( count(Source.mon) 
    for mon in ([Aug], [Sep], [Oct], [Nov], [Dec], [Jan])
 ) as PivotTable
 ) RCMonth
 join ( select count(*) Total,
         reasoncode 
        from rc_report
        where createdon  >= DATEADD(MONTH, -6, GETDATE()) 
        group by reasoncode
        union all
        select count(*) Total,
         'Sum'
        from rc_report
        where createdon  >= DATEADD(MONTH, -6, GETDATE())
        ) RCTotal
  on RCTotal.ReasonCode = RCMonth.ReasonCode
 cross join  (
 select count(*) Total
        from rc_report
        where createdon  >= DATEADD(MONTH, -6, GETDATE()) ) Total 
    order by RCMonth.ReasonCode

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

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