投食 2018-09-28 03:39 采纳率: 100%
浏览 5180
已采纳

case when的时候count 的用法

select a,b,

count(CASE WHEN c>5 and d >10 THEN distinct e
WHEN c=5 and d =10 THEN distinct e
WHEN c>5 and d <10 THEN distinct e
END)x
from table_name
group by a,b
请问这样的语法有问题吗?

  • 写回答

1条回答 默认 最新

  • 互联网叫兽 2018-09-28 07:02
    关注

    语法是有问题的,问题定位在【distinct】,删除【distinct】语法就是正确的了。

    我不太知道这段sql是用来干什么的,只能猜测下:

    首先:
    distinct这个关键字用来过滤掉多余的重复记录只保留一条 ,
    我猜测你是想要查询满足条件,同时又想根据e字段来去重,但是没有没有搞清楚distinct的用法

    图片说明

    先执行
    select a,b,

    count(
    CASE
    WHEN c>5 and d >10 THEN e
    WHEN c=5 and d =10 THEN e
    WHEN c>5 and d <10 THEN e
    END)x
    from test
    group by a,b

    执行结果
    a b x
    小兰 数学 1
    小兰 语文 2
    小文 语文 1
    张三 语文 1
    李四 语文 0

    sql目的是:查询出满足case when 中 条件的学生信息 (比如:小兰 语文 2 ------表示小兰有2条数据满足条件,李四 语文 0 ----表示一条都不满足)

    考虑到你 想对 e字段进行去重处理

    如果你想要这样写:

    select DISTINCT a,b,e,

    count(
    CASE
    WHEN c>5 and d >10 THEN e
    WHEN c=5 and d =10 THEN e
    WHEN c>5 and d <10 THEN e
    END)x
    from test
    group by a,b,e

    这样 的SQL是没有意义的,因为本来就已经已经group by a,b,e了,使用DISTINCT 结果是一样的

    如果非要使用distinct
    可以
    SELECT DISTINCT a,e from (
    select a,b,e,

    count(
    CASE
    WHEN c>5 and d >10 THEN e
    WHEN c=5 and d =10 THEN e
    WHEN c>5 and d <10 THEN e
    END)x
    from test
    group by a,b,e
    )as tb

    a e
    小兰 女
    小文 女
    张三 男
    李四 男

    ps:不太清楚需求,只能自己猜测一下,语法你那样写是不对的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 spring后端vue前端
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题