• EAS_BI(扩展报表)


     

    case when 的使用

    1.

    扩展报表,一张收费单据中,下面分为分录
    问题描述: 收费单中有一个分录用于记录检测的项目名称以及标准费用。收费单有自己的主键,分录中的外键即是收费单的主键,然后分录表总的每一项检测项目有自己的id。每一项指标的费用显示在各自的下面。
    SELECT detail.resource, detail.producename, SUM(mdje), SUM(wdje), SUM(zlje), SUM(yhlje)
    FROM
    (
    SELECT master.resource, master.producename, 
    (CASE WHEN fenlu.item = '密度' THEN fenlu.fee ELSE 0 END) AS mdje,
    (CASE WHEN fenlu.item = '温度' THEN fenlu.fee ELSE 0 END) AS wdje,
    (CASE WHEN fenlu.item = '质量' THEN fenlu.fee ELSE 0 END) AS zlje,
    (CASE WHEN fenlu.item = '氧含量' THEN fenlu.fee ELSE 0 END) AS yhlje
    FROM changesheet AS MASTER LEFT JOIN fenlu ON fenlu.sheetid = master.id
    ) AS detail 
    GROUP BY detail.resource, detail.producename

    2.计数

    Case具有两种格式。简单Case函数和Case搜索函数。
     sex          sex =    sex =

    这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。 
    还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
     
    --比如说,下面这段SQL,你永远无法得到“第二类”这个结果
      col_1  ( , )   col_1  ()

     1 select
     2     case when PostLevel.fnumber = '01' and PERSONTECHPOST.fishightechnical = '1' and GWFL.fnumber = '0101' then 'g正高级'
     3             when PostLevel.fnumber = '02' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber = '0101'  then 'g高级'
     4             when PostLevel.fnumber = '03' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber = '0101' then 'g中级'
     5             when PostLevel.fnumber not in ('03','02','01') and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber = '0101' then 'g初级以下'
     6             when PostLevel.fnumber = '01' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber = '0102' then 'z正高级'
     7             when PostLevel.fnumber = '02' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber = '0102' then 'z高级'
     8             when PostLevel.fnumber = '03' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber = '0102' then 'z中级'
     9             when PostLevel.fnumber not in ('03','02','01') and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber = '0102' then 'z初级以下'
    10             when PostLevel.fnumber = '01' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber not in ('0102','0101') then 'y正高级'
    11             when PostLevel.fnumber = '02' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber not in ('0102','0101') then 'y高级'
    12             when PostLevel.fnumber = '03' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber not in ('0102','0101') then 'y中级'
    13             when PERSONTECHPOST.fishightechnical = '0' and ftechnicalpostid is not null then '职称重复'
    14             else 'y初级以下'
    15             end job,
    16     count(*) number
    17 from T_BD_PERSON as PERSON 
    18     left join T_ORG_POSITIONMEMBER as POSITIONMEMBER on PERSON.fid = POSITIONMEMBER.fpersonid 
    19     left join T_ORG_POSITION as POSITION on POSITION.fid = POSITIONMEMBER.fpositionid
    20     
    21     left join T_HR_BDEMPLOYEETYPE as BDEMPLOYEETYPE on BDEMPLOYEETYPE.fid = PERSON.femployeetypeid 
    22     left join T_BD_EmployeeModle  as EmployeeModle on EmployeeModle.fid = BDEMPLOYEETYPE.femployeemodleid 
    23     left join ct_mp_gwfl as GWFL on GWFL.fid = POSITION.cfgwflid
    24     left join T_ORG_BaseUnit as BaseUnit on BaseUnit.fid = POSITION.fadminorgunitid 
    25     left join T_HR_PERSONTECHPOST as PERSONTECHPOST  on PERSON.fid = PERSONTECHPOST.fpersonid
    26     left join T_HR_BDTechPostLevel as PostLevel on PERSONTECHPOST.cflevelid = PostLevel.fid
    27     left join T_HR_PersonPosition  as PersonPosition  on PERSON.fid = PersonPosition.fpersonid
    28 where POSITIONMEMBER.fisprimary = '1'and EmployeeModle.fnumber = 01  and  BaseUnit.FLONGNUMBER like '%@orgnum%'
    29 and PersonPosition.fenterdate <= {ts '@date'} and PERSONTECHPOST.fconferdate <= {ts '@date'} 
    30 group by 
    31     case when PostLevel.fnumber = '01' and PERSONTECHPOST.fishightechnical = '1' and GWFL.fnumber = '0101' then 'g正高级'
    32             when PostLevel.fnumber = '02' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber = '0101'  then 'g高级'
    33             when PostLevel.fnumber = '03' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber = '0101' then 'g中级'
    34             when PostLevel.fnumber not in ('03','02','01') and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber = '0101' then 'g初级以下'
    35             when PostLevel.fnumber = '01' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber = '0102' then 'z正高级'
    36             when PostLevel.fnumber = '02' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber = '0102' then 'z高级'
    37             when PostLevel.fnumber = '03' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber = '0102' then 'z中级'
    38             when PostLevel.fnumber not in ('03','02','01') and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber = '0102' then 'z初级以下'
    39             when PostLevel.fnumber = '01' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber not in ('0102','0101') then 'y正高级'
    40             when PostLevel.fnumber = '02' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber not in ('0102','0101') then 'y高级'
    41             when PostLevel.fnumber = '03' and PERSONTECHPOST.fishightechnical = '1'  and GWFL.fnumber not in ('0102','0101') then 'y中级'
    42             when PERSONTECHPOST.fishightechnical = '0' and ftechnicalpostid is not null then '职称重复'
    43             else 'y初级以下'
    44             end
    View Code

    格式化

    日期

    convert(navarchar(10),登录时间,120)        2016-03-15 00:00:00:000  ->2016-03-15
     

    截取月日

    right(to_char(T_WFR_ASSIGN.fcreatedtime,'yyyy-MM-dd'),5) as creatime,

    小数位数

    convert(decimal(10,2),平均分数)        87.57800  ->     87.58  保留两位小数

    获取年龄

    datediff(yy,"PERSON".fbirthday,{ts'@date'}) < 29

    IN运算符

        需要查询多个条件中满足一个条件的数据,可以使用or运算符,但是对于有较多的条件来说,使用or运算符并不方便,可以使用in代替。
        select * from 省市表 where 省份=‘吉林省’ or 省份=‘辽宁省’ or 省份=‘黑龙江省’
    -》select * from 省市表 where 省份 in ('吉林省',‘辽宁省’,‘黑龙江省’)
    实际应用:
    多期间:多表连接,多期间
    想要的效果就是 2015年3月 以及 2016年4月份的数据
    eg: b203.year in (2015, 2016) and b203.month in(3, 4) and b204.year in (2015, 2016) and b204.month in(3, 4)  
       这种情况 就会出现,20153 20154 20163 20164  并不符合要求!
    应该使用下面这种:
     and (B203.cfyear||B203.cfmonth) in (20163,20165)
     and (B2041.cfyear||B2041.cfmonth) = (B203.cfyear||B203.cfmonth) 
    多表才会出现同期间数据!
     
     
     

    ksql 中对参数日期的处理

    1.
    (case when "GWFL".fname_l2 = '管理类-高层管理岗' then datediff(yy,"PERSON".fbirthday,{ts'@date'}) end) as "高层管理年龄",

    KSQL中用日期常量必须用{ts'" + dateTime.ToString("yyyy-M-d HH:mm:ss") + "'} 正确写法
    {ts'1091-1-1'}就代表单引号里的值是日期常量
    使用形式:{ts'@date'}
    2.
    to_char("T_MRM_MRAPPLY".FSTARTTIME,'YYYY-MM-DD') =to_char({d '@time'},'YYYY-MM-DD')
    都转成字符串进行比较
    3.
    截取
    to_number(substring(@intPeriod,0,4))
     
    4. ksql 对文本日期 转化  {ts'date'}
     and cfreaddate >={ts'2018-01-20'} and cfreaddate<={ts'2018-04-20'}

     

    ksql日期范围查询

    ksql:参数 日期空间中sql语法
    where "PROPOSERORG".flongnumber like ('@orgNumber%')
       and "MATERIALRECEIVEDBILL".FBizDate >= {d '@startDate' }
       and "MATERIALRECEIVEDBILL".FBizDate <= {d '@endDate' }
       and "PROPOSER".fid in ('@user')

    条件匹配

    IF
    (
        COUNTA
        (
            SELECT
            (
                分配单, LEADERNAME, , AND(FBIZOBJID=A3, LEADERNAME=H2)
            )
        ) = 0,
        " ", "△"
    )

    counta 

      对目标进行非空值计数。
      如果不需要统计逻辑值、文字或错误值,使用COUNT函数。
    最终效果图:
    =IF(COUNTA(SELECT(分配单, LEADERNAME, , AND(FBIZOBJID = A3, LEADERNAME = H2))) = 0, " ", "△")

     斑马线背景色

    IF
    (
        MOD(ROW(), 2) = 1, RGB(213, 217, 211), RGB(255, 255, 255)
    )

     Case条件判断

    {
        CASE
        (
            FIELD(天津天保控股贷款情况一览表_LYC, 担保方式) = 1, "保证",
            FIELD(天津天保控股贷款情况一览表_LYC, 担保方式) = 2, "抵押",
            FIELD(天津天保控股贷款情况一览表_LYC, 担保方式) = 3, "质押",
            FIELD(天津天保控股贷款情况一览表_LYC, 担保方式) = 4, "信用",
            FIELD(天津天保控股贷款情况一览表_LYC, 担保方式) = 5, "其它",
            FIELD(天津天保控股贷款情况一览表_LYC, 担保方式) = 6, "混合",
            FIELD(天津天保控股贷款情况一览表_LYC, 担保方式) = 7, "无担保",
            ""
        )
    }

    行隐藏

    --行隐藏
    IF
    (
        VALUE(M2) = 0, True, False
    )

    合并字符串 ARRAYTEXT

    ARRAYTEXT({",", "", "", True, True}, EXS(B2))
    ARRAYTEXT ( {
    ",", "", "", True, True}, O2, P2, Q2 ) IF ( SELECT1 ( 天津天保控股贷款情况一览表_担保抵押, 担保单位, AND(FPARENTBILLID=E2, 方式=1) ) = Null, "", ARRAYTEXT ( {"", "担保人:", "", True, True}, SELECT1 ( 天津天保控股贷款情况一览表_担保抵押, 担保单位, AND(FPARENTBILLID=E2, 方式=1) ) ) )
     
  • 相关阅读:
    RedHat5.8 编译内核驱动 合成initrd.img
    matrix-gui-2.0 将javascript文件夹改成js文件夹
    使用PHP配置文件
    Ubuntu 16.10 Apache PHP Server
    Ubuntu 16.10 中文环境 Shell输出英文提示
    制作SD卡img文件,并扩容
    Linux syslogd
    Windows cmd findstr
    jquery ztree异步搜索
    怎样在点击li时添加样式,移除兄弟样式
  • 原文地址:https://www.cnblogs.com/lyc-smile/p/7489735.html
Copyright © 2020-2023  润新知