ORACLE 交叉报表固定列实现方法

ORACLE 交叉报表固定列实现方法

需求:
统计某些天内每个类型的数量,

原数据 MCTYPE 类型:DTH,MED,OTH
TDay时间划分:T1,T2,T3,T4~T10
原始data
如果DTHIND=1 那么这条记录类型就是DTH类型,其他类推

idDTHINDMEDINDOTHIND
16006723010
16006730010
16006735010
16006744100
16006757100
16006772100
16007009010

使用交叉报表后show 出的data

MCTYPET1T2T3T4~T10
DTH1002
MED0013

但是Clients 需求是不管是否有data,都要show 出全部类型,全部日期
期望结果是

MCTYPET1T2T3T4~T10
DTH1002
MED0013
OTH0000

原代码贴上代码

select MCTYPE,
  COUNT(DECODE(TDATE,'T1','T1',NULL)) AS T1,
  COUNT(DECODE(TDATE,'T2','T2',NULL)) AS T2,
  COUNT(DECODE(TDATE,'T3','T3',NULL)) AS T3,
  COUNT(DECODE(TDATE,'T4~T10','T4',NULL)) AS "T4~T10" FROM (
select case when sc.dthind=1 then 'DTH'
    when sc.medind=1 then 'MED'
    when sc.othind=1 then 'OTH' else null end  as mctype,
    case when sc.crtdate >=(SELECT BIZDATE FROM SYSINFO) and sc.crtdate<=(SELECT BIZDATE+1 FROM SYSINFO) then 'T0'
    when sc.crtdate >=(SELECT BIZDATE-1 FROM SYSINFO) and sc.crtdate<=(SELECT BIZDATE FROM SYSINFO) then 'T1'
    when sc.crtdate >=(SELECT BIZDATE-2 FROM SYSINFO) and sc.crtdate<=(SELECT BIZDATE-1 FROM SYSINFO) then 'T2'
    when sc.crtdate >=(SELECT BIZDATE-3 FROM SYSINFO) and sc.crtdate<=(SELECT BIZDATE-2 FROM SYSINFO) then 'T3'
    when sc.crtdate >=(SELECT BIZDATE-10 FROM SYSINFO) and sc.crtdate<=(SELECT BIZDATE-3 FROM SYSINFO) then 'T4~T10'
    else null end as Tdate
    from cccbsc sc where sc.clmnum in ('16006772','16007009','16006744','16006757','16006723','16006730','16006735')
  and  crtdate >=(SELECT BIZDATE - 10 FROM SYSINFO) 
      AND crtdate < (SELECT BIZDATE FROM SYSINFO)) GROUP BY MCTYPE 

实现方法是
union all 所有的行和列一遍,这里是3*4,也就是union all 12条记录,然后所有统计的数量
减一条

select MCTYPE,
  COUNT(DECODE(TDATE,'T1','T1',NULL))-1 AS T1,
  COUNT(DECODE(TDATE,'T2','T2',NULL))-1 AS T2,
  COUNT(DECODE(TDATE,'T3','T3',NULL))-1 AS T3,
  COUNT(DECODE(TDATE,'T4~T10','T4',NULL))-1 AS "T4~T10" FROM (
select case when sc.dthind=1 then 'DTH'
    when sc.medind=1 then 'MED'
    when sc.othind=1 then 'OTH' else null end  as mctype,
    case when sc.crtdate >=(SELECT BIZDATE FROM SYSINFO) and sc.crtdate<=(SELECT BIZDATE+1 FROM SYSINFO) then 'T0'
    when sc.crtdate >=(SELECT BIZDATE-1 FROM SYSINFO) and sc.crtdate<=(SELECT BIZDATE FROM SYSINFO) then 'T1'
    when sc.crtdate >=(SELECT BIZDATE-2 FROM SYSINFO) and sc.crtdate<=(SELECT BIZDATE-1 FROM SYSINFO) then 'T2'
    when sc.crtdate >=(SELECT BIZDATE-3 FROM SYSINFO) and sc.crtdate<=(SELECT BIZDATE-2 FROM SYSINFO) then 'T3'
    when sc.crtdate >=(SELECT BIZDATE-10 FROM SYSINFO) and sc.crtdate<=(SELECT BIZDATE-3 FROM SYSINFO) then 'T4~T10'
    else null end as Tdate
    from cccbsc sc where sc.clmnum in ('16006772','16007009','16006744','16006757','16006723','16006730','16006735')
  and  crtdate >=(SELECT BIZDATE - 10 FROM SYSINFO) 
      AND crtdate < (SELECT BIZDATE FROM SYSINFO)
      union all select 'DTH' AS MCTYPE,'T1' AS TDATE FROM DUAL 
union all select 'DTH' AS MCTYPE,'T2' AS TDATE FROM DUAL
union all select 'DTH' AS MCTYPE,'T3' AS TDATE FROM DUAL 
union all select 'DTH' AS MCTYPE,'T4~T10' AS TDATE FROM DUAL
union all select 'MED' AS MCTYPE,'T1' AS TDATE FROM DUAL 
union all select 'MED' AS MCTYPE,'T2' AS TDATE FROM DUAL
union all select 'MED' AS MCTYPE,'T3' AS TDATE FROM DUAL 
union all select 'MED' AS MCTYPE,'T4~T10' AS TDATE FROM DUAL
union all select 'OTH' AS MCTYPE,'T1' AS TDATE FROM DUAL 
union all select 'OTH' AS MCTYPE,'T2' AS TDATE FROM DUAL
union all select 'OTH' AS MCTYPE,'T3' AS TDATE FROM DUAL 
union all select 'OTH' AS MCTYPE,'T4~T10' AS TDATE FROM DUAL) GROUP BY MCTYPE 
;

原理其实就是group by 的时候让每个行和列都有值,然后show的时候再把加多的减去就可以了。
如果有什么其他简单的方法可以固定行和列也可以告诉我,谢谢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值