【问题标题】:Count function within a Case When conditionCase When 条件下的计数函数
【发布时间】:2012-06-05 18:27:55
【问题描述】:

谁能向我解释以下 SQL 语句之间的区别?我可以看到存在差异,但我无法确定可以使它们产生不同结果的确切条件。顺便说一句,我认为distinct 子句对user.id 字段没有影响,因为所有ID 都已经是唯一的。查询的目的是计算唯一(非空)姓氏的数量。如果姓氏为空,则计为唯一。

我想这个问题的一般情况是在 case-when 语句中使用聚合函数。

在 Case-When 内计数:

SELECT 
    (case when (substr(u.name,40,40) <> '                                        ')
        then count(distinct(substr(u.name,40,40)))
        else count(u.id) 
    end) as "LAST_NAME",
FROM 
    users u
GROUP BY
    substr(u.name,40,40)

Case-When within Count:

SELECT 
    count (distinct case when (substr(u.name,40,40) <> '                                        ')
        then substr(u.name,40,40)
        else to_char(u.id)
    end) as "LAST_NAME",
FROM 
    users u
GROUP BY
    substr(u.name,40,40)

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    如果user.idPRIMARY KEY,则这些查询在语义上是相同的,尽管它们可能会产生不同的执行计划。

    他们将为所有非空姓氏返回 1,因为您正在计算其组内 group-by expession 的不同值,根据定义,这将是一个。

    对于空姓氏,第一个查询将基本返回COUNT(u.id),第二个查询将返回COUNT(DISTINCT TO_CHAR(u.id)),鉴于u.id 是唯一的,它们是相同的。

    我认为您需要从第二个查询中删除 GROUP BY

    SELECT  count (distinct case when (substr(u.name,40,40) <> '                                        ')
            then substr(u.name,40,40)
            else to_char(u.id)
        end) as "LAST_NAME",
    FROM 
        users u
    

    【讨论】:

      猜你喜欢
      • 2018-04-21
      • 2016-05-24
      • 2018-02-09
      • 2021-05-08
      • 1970-01-01
      • 2014-08-25
      • 2019-02-01
      • 1970-01-01
      • 2012-05-11
      相关资源
      最近更新 更多