在SQL Server中串联多行以形成一行?

时间:2019-11-27 21:50:54

标签: sql sql-server concatenation aggregate-functions

概述

我需要构建一个描述实体的描述字段。我正在使用的数据具有针对表中每个单独键的属性描述。下面是数据的示例:

+------------+--------------------+----------+
|    Key     |        Desc        | Order_Id |
+------------+--------------------+----------+
| 5962417474 | Big Yellow Door    |    14775 |
| 5962417474 | Orange Windows     |    14776 |
| 5962417474 | Blue Triangle Roof |    14777 |
+------------+--------------------+----------+

最初,我使用聚合函数编写了一个查询,如下所示:

SELECT
    [P].[KEY],
    CONCAT (MIN([P].[Desc]), + ' ' + MAX([P].[Desc])) [PROPERTY_DESCRIPTION]
FROM [dbo].[PROP_DESC] [P] 
WHERE [P].[KEY] = '5962417474'
GROUP BY [P].[KEY];

这对于两个行条目非常有用,但是后来我意识到如果我有多个记录用于属性描述,该怎么办?因此,我编写了以下查询来检查是否有多个属性描述:

SELECT 
    [P].[KEY], COUNT([P].[KEY])
FROM [dbo].[PROP_DESC] [P]
GROUP BY [P].[KEY]
HAVING COUNT(*) > 2; -- Returns one record which is the above table result.

这给了我一条记录,记录中包含三个描述,因此我的原始查询无法正常工作。有多个字段时如何解决此问题?

所需的输出

+------------+---------------------------------------------------+----------+
|    Key     |                       Desc                        | Order_Id |
+------------+---------------------------------------------------+----------+
| 5962417474 | Big Yellow Door Orange Windows Blue Triangle Roof |    14775 |
+------------+---------------------------------------------------+----------+

3 个答案:

答案 0 :(得分:1)

这取决于您使用的SQL语言,但是您将需要使用某种类型的组concat / array agg函数。例如:

SELECT
  Key,
  STRING_AGG(desc, ', ')
  FROM TABLE
  GROUP BY Key;

答案 1 :(得分:0)

对于以下那些具有相同问题并且无权访问STRING_AGG中引入的SQL Server 2017的人,我已经通过以下查询解决了我的问题:

SELECT 
    [P].[KEY],
    [PROPERTY_DESCRIPTION] = STUFF((
          SELECT ' ' + [P2].[DESC]
          FROM [dbo].[PROP_DESC] [P2]
          WHERE [P].[KEY] = [P2].[KEY]
          FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '')
 FROM [dbo].[PROP_DESC] [P]
 WHERE [P].[KEY] = '5962417474'
 GROUP BY [P].[KEY]

答案 2 :(得分:0)

在SQL Server中有很多方法可以做到这一点:

以下是一种方法:

SELECT  key
            ,STUFF((SELECT '| ' + CAST(prop_desc AS VARCHAR(MAX)) [text()]
            FROM PROP_DESC 
            WHERE key = t.key
            FOR XML PATH(''), TYPE)
            .value('.','NVARCHAR(MAX)'),1,2,' ') prop_desc
            FROM PROP_DESC t
            GROUP BY key