首页 > 解决方案 > SQL group by 连接查询结果的字符串

问题描述

我有一个连接多个表的查询。结果我有几个字段,但我需要按其中一个将其他字段的内容连接到字符串中进行分组。

查询结果如下表:

* query result
+-----------+-------------+
| element   |   option    |
+-----------+-------------+
|   25      |    foo 2    |
|   25      |    bar 1    |
|   25      |    baz 1    |
|   30      |    foo 2    |
|   30      |    baz 5    |
|   32      |    baz 1    |
+-----------+-------------+

我以前做过类似的事情,GROUP_CONCAT如下所示:

SELECT
  result.element,
  GROUP_CONCAT(result.options SEPARATOR ', ') AS 'options'
FROM (
  -- place here an sql query with joins and some calculated fields --
) AS result
GROUP BY result.element

它通常可以工作,但是我现在要做这个查询的 sql server 似乎不支持GROUP_CONCAT.

sql server 版本是Microsoft SQL Server 2014 (SP2-CU8) (KB4037356) - 12.0.5557.0 (X64) Standard Edition (64-bit) o​​n Windows NT 6.3 (Build 9600:) (Hypervisor)

我最终需要的是这样的:

* final result
+-----------+-----------------------------+
| element   |   option                    |
+-----------+-----------------------------+
|   25      |    foo 2, bar 1, baz 1      |
|   30      |    foo 2, baz 5             |
|   32      |    baz 1                    |
+-----------+-----------------------------+

我搜索了很多,我找到了一种直接从表中执行此操作的方法,而不是从另一个查询结果中。怎么做?

编辑:请记住,我必须从查询结果而不是表中执行 xml 路径。我了解如何从表中使用它,但我不了解如何使用查询结果中的 xml 路径。

如果我使用类似的东西:

SELECT
  result.element,
  ( SELECT STUFF((SELECT ',' + options
    FROM result T2
    WHERE T2.element= result.element
    ORDER BY element
    FOR XML PATH('')), 1, 1, '') )AS 'options'
FROM (

  SELECT 
    st.element AS 'element',
    CONCAT(st.salesoriginid, ' ', COUNT(st.salesoriginid)) AS 'options'

  FROM SALESTABLE AS st WITH (NOLOCK)
  LEFT JOIN SALESLINE AS sl WITH (NOLOCK) ON sl.SALESID = st.SALESID AND sl.DATAAREAID = st.DATAAREAID
  LEFT JOIN INVENTDIM AS idim WITH (NOLOCK) ON idim.INVENTDIMID = sl.INVENTDIMID AND idim.DATAAREAID = sl.DATAAREAID

  WHERE st.salestype = 3
    AND st.salesoriginid IS NOT NULL
    AND st.salesoriginid != ''

  GROUP BY st.element, st.salesoriginid

) AS result
GROUP BY result.element

然后我得到错误:

Invalid object name 'result' [SQL State=S0002, DB Errorcode=208]

标签: sqlsql-serversql-server-2014

解决方案


你可以使用东西

Select Distinct element, (
SELECT STUFF((SELECT ',' +option
FROM #T T2
Where T2.element = T1.element
ORDER BY element
FOR XML PATH('')), 1, 1, '') )AS [Options]
From #T T1

推荐阅读