【问题标题】:Trouble with query select distinct order by case查询的问题按案例选择不同的顺序
【发布时间】:2019-11-21 23:53:37
【问题描述】:

在问题的帮助下,我学会了如何使用SELECT DISTINCTORDER BY
How to use DISTINCT and ORDER BY in same SELECT statement?

我从这个问题中学会了使用ORDER BY CASE
How do I return rows with a specific value first?

但是我有一个很难写的查询:

我有一张表CUSTOMER 和一列NAME,我想获取所有不同 客户的姓名,我想先找到名称“Hamza”。

SELECT DISTINCT "CUSTOMER"."NAME",
    Max("CUSTOMER"."NAME")
FROM "CUSTOMER"
WHERE
    "CUSTOMER".id >= 2
GROUP BY "CUSTOMER"."NAME"
ORDER BY CASE WHEN ("CUSTOMER"."NAME" = 'HAMZA' ) THEN 1 ELSE 2 END


错误

错误:对于 SELECT DISTINCT,ORDER BY 表达式必须出现在选择列表中
第 15 行:按大小写排序 WHEN ("CUSTOMER"."NAME" = 'HAMZA') THEN 1 EL...
_________________.^
SQL 状态:42P10
字符:372


编辑

解决方法:

SELECT "CUSTOMER"."NAME", -- distinct keyword removed here
    Max("CUSTOMER"."NAME")
FROM "CUSTOMER"
WHERE
    "CUSTOMER".id >= 2
GROUP BY "CUSTOMER"."NAME"
ORDER BY
CASE WHEN ("CUSTOMER"."NAME" = 'HAMZA' ) THEN 1 ELSE 2 END,
CASE WHEN ("CUSTOMER"."NAME" = 'GIORNO' ) THEN 1 ELSE 2 END

【问题讨论】:

    标签: sql postgresql select distinct


    【解决方案1】:

    分组已经确保您获得不同的客户名称。只需删除此修饰符,您就可以了:

    SELECT "CUSTOMER"."NAME", -- distinct keyword removed here
        Max("CUSTOMER"."NAME")
    FROM "CUSTOMER"
    WHERE
        "CUSTOMER".id >= 2
    GROUP BY "CUSTOMER"."NAME"
    ORDER BY CASE WHEN ("CUSTOMER"."NAME" = 'HAMZA' ) THEN 1 ELSE 2 END
    

    【讨论】:

      【解决方案2】:

      我想获取客户的所有不同名称,并且我想首先找到名称“Hamza”。

      为什么不这样做呢?

      SELECT "CUSTOMER"."NAME"
      FROM "CUSTOMER" 
      GROUP BY "CUSTOMER"."NAME" 
      ORDER BY ("CUSTOMER"."NAME"  = 'Hamza') DESC
      

      SELECT DISTINCT 与聚合函数一起使用通常只会混淆查询逻辑。

      我也不知道你为什么要选择两次名字。

      【讨论】:

      • 确实解决方案没有使用DISTINCT,但是对于其余的查询,它可能没有意义,因为有业务的事情,我已经改变了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 2017-06-02
      相关资源
      最近更新 更多