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
现在我希望 t1
和 t2
被推断为相同的值 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】:在派生表(子查询)中“合并”case
,group 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 值”作为错误出现。为啥?