SQL CASE 语句返回重复值

Posted

技术标签:

【中文标题】SQL CASE 语句返回重复值【英文标题】:SQL CASE statement returns duplicate values 【发布时间】:2019-12-04 19:03:45 【问题描述】:

这是我的数据的样子

title  value 
------------
 t1      v1
 t2      v2
 t3      v3

现在我希望 t1t2 被推断为相同的值 t12。所以,我愿意:

SELECT 
    CASE
       WHEN title = 't1' OR title = 't2' 
          THEN 't12'
          ELSE title 
    END AS inferred_title,
    COUNT(value)
FROM 
    my_table
GROUP BY 
    inferred_title;

我预计输出是:

inferred title  values
-----------------------
   t12            2
   t3             1

但我最终得到的是:

inferred title     values
--------------------------
   t12                1
   t12                1
   t3                 1

如何让它按照我想要的方式运行?我不想要重复的行。

【问题讨论】:

你的 DBMS 是什么?它为 Postgresql 和 mysql 8 带来了你想要的结果。 Group by 不能使用别名,由于操作顺序。 Group by 也必须有 case 语句;或者您必须使用子查询/ cte 来获取案例的结果及其在聚合之前的别名。只有 order by 可以使用别名 @BarbarosÖzhan Redshift,所以是 Postgresql 您的案例即使在 ver. 8.4 中也适用于 Postgresql,但对于 Red-shift,我不能说什么,似乎没有 @Barbaros 我知道在 group by 中使用表达式别名不起作用。但是它显示为 1 的 o/p 是什么,好像它不起作用,为什么它会给 OP 带来错误 【参考方案1】:

问题在于范围界定。表中必须有 inferred_title。要么给一个新的列别名,要么重复这个表达式:

SELECT (CASE WHEN title IN ('t1', 't2') THEN 't12'
             ELSE title
        END) AS inferred_title,
       COUNT(value)
FROM my_table
GROUP BY (CASE WHEN title IN ('t1', 't2') THEN 't12'
               ELSE title
          END);

【讨论】:

我知道在 group by 中使用表达式别名不起作用。但是它显示为 1 的 o/p 是什么,好像它不起作用,为什么它会给 OP 带来错误【参考方案2】:

在派生表(子查询)中“合并”casegroup by 其结果:

SELECT inferred_title, COUNT(value)
FROM
(
    SELECT CASE WHEN title = 't1' OR title = 't2' THEN 't12'
                ELSE title 
           END AS inferred_title,
           value
    FROM my_table
) dt
GROUP BY inferred_title;

这可以为您节省一些输入,更不容易出错并且更易于维护 - 并且是 ANSI SQL 兼容!

【讨论】:

【参考方案3】:
Select Title, COUNT(Title) AS Totals
From my_table          
Group By Title
Having COUNT(Title)>1
Order By 2 desc

【讨论】:

感谢您对 StackO 的贡献。努力在你的答案中添加一些解释,以帮助理解它如何解决问题,提供的代码(如果有的话)中缺少什么或需要更改,而不是仅仅放置一些裸代码。 顺便说一句,当 OP 想要根据原始 title 值构建不同的标题时,您将保留原始 title 值,因此此答案不能解决问题

以上是关于SQL CASE 语句返回重复值的主要内容,如果未能解决你的问题,请参考以下文章

在 switch case 语句中,它说“重复的 case 值”作为错误出现。为啥?

SQL:如何删除由 CASE WHEN 语句创建的重复行

SQL Server 2008 - SELECT 子句中的 Case / If 语句 [重复]

SQL IN 语句 - 返回结果时保持重复

在 SQL 中使用 IF/ELSE 重复 CASE 块

[讲解]sql except和intersect运算符(比拟两个或多个select语句的结果并前去非重复值)