SQL группа по объединенной строке результата запроса - PullRequest
0 голосов
/ 10 июля 2019

У меня есть запрос, который объединяет несколько таблиц.В результате у меня есть несколько полей, но мне нужно сгруппировать по одному из них, объединяя содержимое другого поля в строку.

Результат запроса похож на следующую таблицу:

* 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-сервер, который я должен сделать сейчас, не поддерживает GROUP_CONCAT.

Версия сервера sql Microsoft SQL Server 2014 (SP2-CU8) (KB4037356) - 12.0.5557.0 (X64) Standard Edition (64-разрядная версия) в Windows NT 6.3 (сборка 9600:) (Гипервизор)

В итоге мне нужно что-то вроде этого:

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

Ответы [ 3 ]

1 голос
/ 10 июля 2019

Вы можете использовать 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
0 голосов
/ 10 июля 2019

Как насчет использования 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;

Вы, вероятно, можете упростить это, вытягивая элементы непосредственно из базовой таблицы.

0 голосов
/ 10 июля 2019

Это должно работать:

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
...