Sqlite 如何使用CASE语句组合行
我有一个数据库,有58个客户(58行)和一个列(国家)。如何将一个国家只出现一次的所有行分组,并使用Sqlite 如何使用CASE语句组合行,sqlite,Sqlite,我有一个数据库,有58个客户(58行)和一个列(国家)。如何将一个国家只出现一次的所有行分组,并使用CASE语句将其名称更改为“Other” SELECT CASE WHEN (SELECT COUNT(country) FROM customer GROUP BY country)=1 THEN 'Other' ELSE country END country FROM customer 问题是,当我运行我的查询时,所有国家都变成了其他国家。我
CASE
语句将其名称更改为“Other”
SELECT
CASE
WHEN (SELECT COUNT(country) FROM customer GROUP BY country)=1 THEN 'Other'
ELSE country
END country
FROM customer
问题是,当我运行我的查询时,所有国家都变成了其他国家。我只希望出现过一次的国家被称为其他国家。以下是如何做到这一点
选择
当计数(国家)=1时,则“其他”国家/地区结束
来自客户
按国家分组;
带有一个子查询,该子查询统计一个国家/地区在表中出现的次数:
SELECT
CASE
WHEN (SELECT COUNT(*) FROM customer WHERE country = c.country) = 1 THEN 'Other'
ELSE c.country
END country
FROM customer c
或者将表连接到返回所有国家/地区的所有计数器的子查询:
SELECT
CASE
WHEN g.counter = 1 THEN 'Other'
ELSE c.country
END country
FROM customer c INNER JOIN (
SELECT country, COUNT(*) counter
FROM customer
GROUP BY country
) g ON g.country = c.country
如果要根据此CASE语句的结果对表进行分组,请使用别名与表的列国家/地区:
SELECT
CASE
WHEN (SELECT COUNT(*) FROM customer WHERE country = c.country) = 1 THEN 'Other'
ELSE c.country
END _country
FROM customer c
GROUP BY _country
要更新实际表格,请执行以下操作:
WITH map AS
(SELECT country,
CASE WHEN COUNT(country) = 1 THEN 'Other'
ELSE country END mapped
FROM customer
GROUP BY country)
UPDATE customer
SET country = (SELECT mapped FROM map WHERE map.country = customer.country);
谢谢您编写的解决方案是可行的,但我不理解WHERE语句country=c.country是如何工作的。你能解释一下吗?感谢c
是主表customer
的别名。子查询:SELECT COUNT(*)FROM customer WHERE country=c.country
返回每个c.country
的行数。