Sqlite 如何使用CASE语句组合行

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 问题是,当我运行我的查询时,所有国家都变成了其他国家。我

我有一个数据库,有58个客户(58行)和一个列(国家)。如何将一个国家只出现一次的所有行分组,并使用
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
的行数。