SQL group by 连接查询结果的字符串

Posted

技术标签:

【中文标题】SQL group by 连接查询结果的字符串【英文标题】:SQL group by concatenate string of a query result 【发布时间】:2019-07-10 08:18:49 【问题描述】:

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

查询结果如下表:

* 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]

【问题讨论】:

SQL Server 不支持GROUP_CONCAT。请参阅here 了解替代方案。 sql server 版本? How Stuff and 'For Xml Path' work in Sql Server的可能重复 "but not from another query result"这是什么意思?你能在你的问题中显示样本吗 SQL Server 2008 concatenate rows to column的可能重复 【参考方案1】:

您可以使用STUFF

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

【讨论】:

【参考方案2】:

这应该可行:

select element,option= stuff((select ',' + option from table t1 where 
t1.element=t2.element for xml path ('')),'',1,1) from table t2
group by element

【讨论】:

【参考方案3】:

使用 CTE 怎么样?

with t as (
      <your query here>
     )
select e.element,
       stuff( (select ',' + t2.option
               from t t2
               where t2.element = e.element
               for xml path ('')
              ), 1, 1, ''
            ) as options
from (select distinct element from t) e;

您可以通过直接从基表中提取元素来简化此操作。

【讨论】:

以上是关于SQL group by 连接查询结果的字符串的主要内容,如果未能解决你的问题,请参考以下文章

具有 group by 和两个表连接的 Sql 子查询

SQL - 使用 GROUP BY 获取子查询子集中或连接中的最新记录

sql-多表查询JOIN与分组GROUP BY

如何在 PostgreSQL 'group by' 查询中连接字符串字段的字符串?

LINQ to Sql 左外连接与 Group By 和 Have 子句

如何在没有算术计数的SQL子查询中使用GROUP BY