У меня есть запрос, который объединяет несколько таблиц.В результате у меня есть несколько полей, но мне нужно сгруппировать по одному из них, объединяя содержимое другого поля в строку.
Результат запроса похож на следующую таблицу:
* 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]