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

SQL Server中如何结合WHERE条件与GROUP BY拼接列值

问题解决:过滤条件下按资产类型统计并拼接ID

你的问题根源很明确:主查询通过a.AssetSeqNumber IN (1,2,3,4,5)过滤了数据,但子查询只匹配了AssetType = a.AssetType,没有同步这个ID过滤条件,所以子查询会拉取该资产类型下的所有ID,包括不在指定列表里的101、102。

下面是三种可行的解决方法:

方法1:子查询添加相同的ID过滤条件

直接在子查询里加上和主查询一致的AssetSeqNumber IN (1,2,3,4,5)条件,确保只拼接符合要求的ID:

SELECT
    AssetType, 
    COUNT(AssetSeqNumber) AS count,
    STUFF((SELECT DISTINCT ',' + CAST(AssetSeqNumber AS varchar(100))
           FROM Asset
           WHERE AssetType = a.AssetType 
             AND AssetSeqNumber IN (1, 2, 3, 4, 5) -- 添加此条件
           FOR XML PATH ('')), 1, 1, '') AS AssetIds
FROM 
    Asset AS a
WHERE
    a.AssetSeqNumber IN (1, 2, 3, 4, 5)
GROUP BY 
    AssetType

方法2:先用CTE过滤目标数据集

先把符合条件的数据提取到公共表表达式(CTE)中,后续的统计和拼接都基于这个过滤后的数据集,避免重复写过滤条件:

WITH FilteredAssets AS (
    SELECT AssetSeqNumber, AssetType
    FROM Asset
    WHERE AssetSeqNumber IN (1, 2, 3, 4, 5)
)
SELECT
    AssetType, 
    COUNT(AssetSeqNumber) AS count,
    STUFF((SELECT DISTINCT ',' + CAST(AssetSeqNumber AS varchar(100))
           FROM FilteredAssets
           WHERE AssetType = fa.AssetType 
           FOR XML PATH ('')), 1, 1, '') AS AssetIds
FROM 
    FilteredAssets AS fa
GROUP BY 
    AssetType

方法3:使用SQL Server 2019支持的STRING_AGG函数(推荐)

SQL Server 2019及以上版本支持STRING_AGG函数,专门用于字符串拼接,语法更简洁直观,不需要嵌套子查询和STUFF:

SELECT
    AssetType, 
    COUNT(AssetSeqNumber) AS count,
    STRING_AGG(DISTINCT CAST(AssetSeqNumber AS varchar(100)), ',') AS AssetIds
FROM 
    Asset
WHERE
    AssetSeqNumber IN (1, 2, 3, 4, 5)
GROUP BY 
    AssetType

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:15:46