【问题标题】:SQL CASE statement returns duplicate valuesSQL CASE 语句返回重复值
【发布时间】: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 带来错误

标签: sql case amazon-redshift


【解决方案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 值,因此此答案不能解决问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多