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

MySQL CASE分组查询中指定显示特定行artist和name字段问题

解决SQL分组后固定显示指定记录的artist和name问题

问题分析

你当前的SQL语句在分组时,artist和name字段既不在分组键中,也未使用聚合函数,数据库会随机选取分组内任意一条记录的对应值,这就是结果中显示artist2而非目标artist1的原因。要固定显示persistent_id = 'C660FF302599636B'对应的artist和name,需要在聚合时明确指定取值逻辑。

解决方案一:使用条件聚合函数

通过CASE语句筛选出目标persistent_id对应的artist和name,再用MAX()或MIN()聚合(分组内仅目标ID对应的该字段有值,其余为NULL,聚合函数会自动忽略NULL),即可固定获取到artist1和name1:

SELECT 
    MAX(CASE WHEN persistent_id = 'C660FF302599636B' THEN artist END) AS artist,
    MAX(CASE WHEN persistent_id = 'C660FF302599636B' THEN name END) AS name,
    SUM(play_count) AS total_play_count,
    CASE 
        WHEN persistent_id IN ('C660FF302599636B', '0BDDB14AE2CC4675') 
        THEN 'C660FF302599636B' 
        ELSE persistent_id 
    END AS persistent_id
FROM tracks
GROUP BY 
    CASE 
        WHEN persistent_id IN ('C660FF302599636B', '0BDDB14AE2CC4675') 
        THEN 'C660FF302599636B' 
        ELSE persistent_id 
    END
ORDER BY total_play_count DESC;

解决方案二:先分组求和再关联原表

先通过CTE计算分组后的总播放量,再关联原表获取目标persistent_id对应的artist和name,逻辑更直观:

WITH grouped_tracks AS (
    SELECT 
        CASE 
            WHEN persistent_id IN ('C660FF302599636B', '0BDDB14AE2CC4675') 
            THEN 'C660FF302599636B' 
            ELSE persistent_id 
        END AS group_id,
        SUM(play_count) AS total_play_count
    FROM tracks
    GROUP BY group_id
)
SELECT 
    t.artist,
    t.name,
    g.total_play_count,
    g.group_id AS persistent_id
FROM grouped_tracks g
LEFT JOIN tracks t ON g.group_id = t.persistent_id
ORDER BY g.total_play_count DESC;

两种方法都能得到你期望的结果:

artist1 name1   92  C660FF302599636B
artist3 name3   10  000ABA9AB1DCD725
artist4 name4   10  00361E574E776781

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:20:20