如果T-SQL中有多行在组中,如何输出单个列或连接另一列
设想以下结构:如果T-SQL中有多行在组中,如何输出单个列或连接另一列,sql,sql-server,tsql,sqlclr,Sql,Sql Server,Tsql,Sqlclr,设想以下结构: Group Color ColorDesc ----- ----- ----- 1 'Red' 'The cool name of Red Color' 1 'Green' 'The cool name of Green Color' 2 'Blue' 'The cool name of Blue Color' 2 'Yellow' 'The cool name of Yellow Color' 2
Group Color ColorDesc
----- ----- -----
1 'Red' 'The cool name of Red Color'
1 'Green' 'The cool name of Green Color'
2 'Blue' 'The cool name of Blue Color'
2 'Yellow' 'The cool name of Yellow Color'
2 'Purple' 'The cool name of Purple Color'
3 'Pink' 'The cool name of Pink Color'
我想将组
字段上的行分组,如果组中只有一行,我需要输出colorDesc列(对于下面的组
=3),但是如果有多个列,我想在字段颜色上获得一个分隔字符串(对于1和2)。期望输出:
Group GroupedColor
----- -----
1 'Red', 'Green'
2 'Blue', 'Yellow', 'Purple'
3 'The cool name of Pink Color'
我可以创建一个多参数CLR聚合并过上愉快的生活,但是有没有一种有效的方法可以用原生T-SQL实现这一点呢?试试这样
SELECT DISTINCT Group,
STUFF((
SELECT ',' + Color
FROM Table1 S
WHERE T.Group = S.Group
FOR XML path('')
), 1, 1, '') [GroupedColor]
FROM Table1 T
试试这个:
SELECT DISTINCT T2.Group,
SUBSTRING((Select ','+
CASE WHEN (SELECT COUNT(Group) FROM T1 WHERE T2.Group=T1.Group)=1
THEN T1.ColorDesc
ELSE T1.Color
END AS [text()]
FROM Table1 T1
WHERE T1.Group = T2.Group
ORDER BY T1.Group
For XML PATH ('')),2, 1000) [Colors]
FROM Table1 T2
希望这能提供答案,或者让你接近答案。试试这个,因为我没有时间在sqlFiddle中尝试。使用“组”作为列名称不受理,请考虑另一个名称
SELECT DISTINCT Group1,
STUFF((
SELECT ',' +
CASE WHEN (SELECT COUNT(Group1) FROM Table1 WHERE Group1=S.Group1)>1
THEN Color
ELSE ColorDesc
END
FROM Table1 S
WHERE T.Group1 = S.Group1
FOR XML path('')
), 1, 1, '') [GroupColor]
FROM Table1 T
参考本文,您正在使用Stuff查找xmlpath。在本例中,我没有使用长名称显示Group=3的第二列。这一列与以前显示GroupId=3的“粉色”相同,而不是“粉色的酷名称”。谢谢,这一列很有效。接下来我要做的是,避免使用'distinct'关键字,因为从技术上讲,代码首先连接所有项目的字符串,然后扫描这些字符串以删除重复项。我倾向于输出所需的任何内容,而不增加删除重复项的开销。无论您采取何种方式来避免,这些sql将很长,并使用一些其他技术,如行数等。我认为这是最短的,因此效率最高。此外,我不知道真实的数据和表。如果有很多数据,那么无论什么情况,你都必须使用分页。是的,我现在只考虑行数。但我也认为短查询(就符号长度而言)并不总是意味着高效。这里的数据结构很难可视化,我试图展示最简单的时刻。但是谢谢你的提示!我认为查询优化超出了最初问题的主题,所以我将其标记为已解决。
SELECT DISTINCT Group1,
STUFF((
SELECT ',' +
CASE WHEN (SELECT COUNT(Group1) FROM Table1 WHERE Group1=S.Group1)>1
THEN Color
ELSE ColorDesc
END
FROM Table1 S
WHERE T.Group1 = S.Group1
FOR XML path('')
), 1, 1, '') [GroupColor]
FROM Table1 T