oracle case.when group by

6 篇文章 0 订阅
数据库 t
表     b
表内容
       Id        Name      胜负
       1          张三     胜
       2          李四     胜
       3          张三     胜
       4          张三     负
       5          王五     胜
       6          赵六     负
要求显示谁胜了几场
select Name, case 胜负 when '胜' then 1 else 0 as SF end from b
显示的内容为
        Name    SF
        张三    1
        李四    1
        张三    1
        张三    0
        王五    1
        赵六    0
把数字进行加法运算需要用到 sum  是根据Name 合并组的
select Name,sum(case 胜负 when '胜' then 1 else 0 end) as '胜利的次数' from b group by Name

显示的内容为
      Name              胜利的次数
      张三                2
      李四                1
      王五                1
      赵六                0
如果要想把胜利几场和失败几场都显示出来
select Name,sum(case 胜负 when '胜' then 1 else 0 end) as '胜利的次数',sum(case 胜负 when '负' then 1 else 0 end)as '失败的次数' from b group by Name
显示的是
       Name               胜利的次数            失败的次数
       张三                 2                        1
       李四                 1                        0
       王五                 1                        0  
       赵六                 0                        1 




String sql = 
                "select t.f_city_name as cityName,count(*) as all_cnt\n" +
                        "       ,sum(case when t.f_status='未通过' then 1 else 0 end) as err_cnt\n" + 
                        "       ,sum(case when t.f_status='通过' then 1 else 0 end) as ok_cnt\n" + 
                        "       ,sum(case when  (select months_between( t.f_checked_time,t.f_created ) months from dual)>=1 then 1 else 0 end) as oneMonth_cnt\n" +
                        "       ,sum(case when  (select months_between( t.f_checked_time,t.f_created ) months from dual)>=2 then 1 else 0 end) as twoMonth_cnt\n" + 
                        "from t_front_maintain t\n" + 
                        whereStr + 
                        "group by t.f_city_name";
        System.out.println("sql"+sql);
        list = jdbcTemplate.queryForList(sql) ;
CASE命令有两种语句格式。
语法形式1CASE expression
            WHEN expression_11 THEN expression_12
             …
            WHEN expression_n1 THEN expression_n2
            [ELSE expression_m]
            END
该语句的执行过程是:将CASE后面表达式的值与各WHEN子句中的表达式的值进行比较,如果两者相等,则返回THEN后的表达式的值,然后跳出CASE语句,否则返回ELSE子句中的表达式的值。ELSE子句是可选项。当CASE语句中不包含ELSE子句时,如果所有比较失败时,CASE语句将返回NULL。
【例】从数据表stud_info中,选取stud_id、grade,如果grade为“男”则输出“M”,如果为“女”输出“F”。
SELECT stud_id, sex=CASE gender
                      WHEN ’男’ THEN ’M’
                      WHEN ’女’ THEN ’F’
                    END
FROM stud_info
语法形式2CASE WHEN condition_expression_1 THEN expression_1
              …
             WHEN condition_expression_n THEN expression_n
             [ELSE expression_m]
           END
该语句的执行过程是:首先测试WHEN后的条件表达式的值,如果其值为真,则返回THEN后面的表达式的值,否则测试下一个WHEN子句中的表达式的值,如果所有WHEN子句后的表达式的值都为假,则返回ELSE后的表达式的值,如果在CASE语句中没有ELSE子句,则CASE表达式返回NULL。
注意:CASE命令可以嵌套到SQL语句中。

【例】从stud_grade表中查询所有同学考试成绩情况,凡成绩为空者输出“未考”、小于60分输出“不及格”、60分至70分输出“及格”、70分至90分输出“良好”、大于或等于90分时输出“优秀”。
SELECT stud_id,name,score=CASE WHEN grade IS NULL THEN ’未考’
                              WHEN grade<60 THEN ’不及格’
                              WHEN grade>=60 AND grade<70 THEN ’及格’
                              WHEN grade>=70 AND grade<90 THEN ’良好’
                              WHEN grade>=90 THEN ’优秀’
                         END
FROM stud_grade 



select case when column=1 then 'a'
             when column=2 then 'b'
            else c
        end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值