Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果T-SQL中有多行在组中,如何输出单个列或连接另一列_Sql_Sql Server_Tsql_Sqlclr - Fatal编程技术网

如果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