Сортировать данные внутри подзапроса с другим подзапросом? - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь отсортировать столбец OUN.note, используя OUN.outcomeKey, так как сейчас он работает, размещая заметки в неправильном порядке (сортировка по алфавиту).Есть идеи, как это сделать?Я пытался отсортировать данные, используя другой подзапрос, но мне не повезло (у меня нет большого опыта).

Вот мой текущий запрос:

SELECT DISTINCT OC.outcomeKey [Outcome Key], OC.outcome [Result],
STUFF((SELECT ','+' '+ OUN.note
FROM
Outcome AS OUT
JOIN OutcomeNote AS OUN
ON OUT.outcomeKey = OUN.outcomeKey
WHERE OUN.outcomeKey = OC.outcomeKey
GROUP BY OUN.note
FOR XML PATH ('')), 1, 1, '') [Outcome Note]
FROM Outcome AS OC

Любая помощь или советы будут с благодарностью!Также, пожалуйста, дайте мне знать, если потребуется дополнительная информация.

1 Ответ

0 голосов
/ 12 мая 2018

Вы можете заменить строку

GROUP BY OUN.note

с линией

ORDER BY OUN.outcomeKey

Кроме того, поскольку конкатенация начинается с ',', вы можете использовать 1, 2, '' в качестве дополнительных аргументов функции STUFF. В противном случае значения в столбце [Результат] всегда начинаются с пробела.

Edit:

Кстати, сортировка заметок по resultKey в подзапросе, который генерирует значения для столбца [Outcome note], не имеет никакого эффекта ... поскольку все заметки в каждом результате подзапроса будут иметь одинаковое значение resultKey ...

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

Если я неправильно понял ваш вопрос, пожалуйста, предоставьте определения таблиц Outcome и OutcomeNote, вместе с демоверсией этих таблиц и желаемым / ожидаемым результатом запроса, пожалуйста.

Редактировать 2:

Начиная с SQL Server 2017, Transact-SQL содержит функцию STRING_AGG, которая функционально эквивалентна (более или менее) функции MySQL GROUP_CONCAT. Используя эту функцию, ваш запрос станет примерно таким:

SELECT
    OUN.outcomeKey [Outcome Key],
    OC.outcome [Result],
    STRING_AGG(OUN.[Note], ', ') WITHIN GROUP (ORDER BY OUN.outcomeKey) [Outcome Note]
FROM
    Outcome AS OC
    JOIN OutcomeNote AS OUN ON OUN.outcomeKey = OC.outcomeKey
GROUP BY
    OUN.outcomeKey,
    OC.outcome;

При использовании SQL Server 2017 или SQL Azure это может быть более подходящим выбором, поскольку он не только делает запрос более читабельным, но и устраняет использование (гораздо менее эффективных) XML-функций в вашем запросе.

В прошлом я тоже интенсивно использовал XML-функциональность для конкатенации полей (то, как вы ее используете), но я заметил значительное снижение производительности моих запросов (которые иногда содержали до 10 столбцов с объединенными данными). С тех пор я склоняюсь к рекурсивным общим табличным выражениям или скалярным UDF с рекурсивными подходами в средах, предшествующих SQL Server 2017.

...