You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CASE语句时如何统计并展示唯一列组合的正确计数?

解决SQL分组计数与CASE转换值不匹配的问题

问题核心

你当前的SQL用Item和City原始字段分组,导致即使CASE转换后生成了相同的Purchase字符串,只要原始的Item/City组合不同,就会被分成多个小组,最终出现重复的Purchase行,计数是原始分组的数量,而非转换后合并的总数。

解决方案

以下两种方法都能得到你想要的结果:

方法1:直接按转换后的结果分组

如果你的数据库支持在GROUP BY中使用SELECT的别名(如MySQL 8.0+、PostgreSQL),可以直接用Purchase别名分组:

SELECT 
    CONCAT(
        CASE 
            WHEN Item LIKE '%Corolla%' THEN 'Toyota'
            WHEN Item LIKE '%Taco%' THEN 'Toyota'
            WHEN Item LIKE 'F%' THEN 'Ford'
            ELSE Item
        END,
        ' in ',
        CASE
            WHEN City LIKE 'Salt Lake%' THEN 'Utah'
            WHEN City LIKE 'Las%' THEN 'California'
            WHEN City LIKE 'San%' THEN 'California'
            ELSE City
        END
    ) AS Purchase,
    COUNT(*) AS Total
FROM PurchaseOrders
GROUP BY Purchase
ORDER BY Purchase;

如果数据库不支持别名分组,就把两个CASE表达式直接放到GROUP BY里:

SELECT 
    CONCAT(
        CASE 
            WHEN Item LIKE '%Corolla%' THEN 'Toyota'
            WHEN Item LIKE '%Taco%' THEN 'Toyota'
            WHEN Item LIKE 'F%' THEN 'Ford'
            ELSE Item
        END,
        ' in ',
        CASE
            WHEN City LIKE 'Salt Lake%' THEN 'Utah'
            WHEN City LIKE 'Las%' THEN 'California'
            WHEN City LIKE 'San%' THEN 'California'
            ELSE City
        END
    ) AS Purchase,
    COUNT(*) AS Total
FROM PurchaseOrders
GROUP BY 
    CASE 
        WHEN Item LIKE '%Corolla%' THEN 'Toyota'
        WHEN Item LIKE '%Taco%' THEN 'Toyota'
        WHEN Item LIKE 'F%' THEN 'Ford'
        ELSE Item
    END,
    CASE
        WHEN City LIKE 'Salt Lake%' THEN 'Utah'
        WHEN City LIKE 'Las%' THEN 'California'
        WHEN City LIKE 'San%' THEN 'California'
        ELSE City
    END
ORDER BY Purchase;

方法2:子查询先转换再分组

先通过子查询把原始数据转换成Brand和State,再基于这两个字段分组拼接,兼容性更强:

SELECT 
    CONCAT(Brand, ' in ', State) AS Purchase,
    COUNT(*) AS Total
FROM (
    SELECT
        CASE 
            WHEN Item LIKE '%Corolla%' THEN 'Toyota'
            WHEN Item LIKE '%Taco%' THEN 'Toyota'
            WHEN Item LIKE 'F%' THEN 'Ford'
            ELSE Item
        END AS Brand,
        CASE
            WHEN City LIKE 'Salt Lake%' THEN 'Utah'
            WHEN City LIKE 'Las%' THEN 'California'
            WHEN City LIKE 'San%' THEN 'California'
            ELSE City
        END AS State
    FROM PurchaseOrders
) AS TransformedData
GROUP BY Brand, State
ORDER BY Purchase;

预期结果

运行以上任意SQL,都会得到正确的统计结果:

Toyota in Utah      5
Ford in California  6

内容的提问来源于stack exchange,提问作者Scott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:18:14