У меня есть следующий запрос:
WITH cteCountryLanguageMapping AS (
SELECT * FROM (
VALUES
('Spain', 'English'),
('Spain', 'Spanish'),
('Sweden', 'English'),
('Switzerland', 'English'),
('Switzerland', 'French'),
('Switzerland', 'German'),
('Switzerland', 'Italian')
) x ([Country], [Language])
)
SELECT
[Country],
CASE COUNT([Language])
WHEN 1 THEN MAX([Language])
WHEN 2 THEN STRING_AGG([Language], ' and ')
ELSE STRING_AGG([Language], ', ')
END AS [Languages],
COUNT([Language]) AS [LanguageCount]
FROM cteCountryLanguageMapping
GROUP BY [Country]
Я ожидал, что значение внутри столбца «Языки» для Швейцарии будет разделено запятыми, т.е.:
| Country | Languages | LanguageCount
--+-------------+-------------------------------------------+--------------
1 | Spain | Spanish and English | 2
2 | Sweden | English | 1
3 | Switzerland | French, German, Italian, English | 4
Вместо этого я получаю вывод ниже (4 значения разделены and
):
| Country | Languages | LanguageCount
--+-------------+-------------------------------------------+--------------
1 | Spain | Spanish and English | 2
2 | Sweden | English | 1
3 | Switzerland | French and German and Italian and English | 4
Что мне не хватает?
Вот еще один пример:
SELECT y, STRING_AGG(z, '+') AS STRING_AGG_PLUS, STRING_AGG(z, '-') AS STRING_AGG_MINUS
FROM (
VALUES
(1, 'a'),
(1, 'b')
) x (y, z)
GROUP by y
| y | STRING_AGG_PLUS | STRING_AGG_MINUS
--+---+-----------------+-----------------
1 | 1 | a+b | a+b
Это ошибка в SQL Server?
CASE COUNT([Language]) WHEN 1234567 THEN STRING_AGG([Language], ' and ') ELSE STRING_AGG([Language], ', ') END AS [Languages]
(используется регистр1234567
) иCASE COUNT([Language]) WHEN 1234567 THEN STRING_AGG([Language], ' and ') END AS [Languages]
(исключаетсяELSE
— теперь совпадение не выполняется, и выражение становитсяNULL
). Каким бы ни был правильный результат, наверняка это не так. - person Jeroen Mostert   schedule 27.09.2018STRING_AGG
полностью отсутствует, и вместо этого выражение привязывается к первому, как если быCASE
дважды сказалSTRING_AGG([Language], ' and ')
. Любые последующиеCASE
также поглощаются. Похоже, с удалением подвыражений происходит что-то очень странное. - person Jeroen Mostert   schedule 27.09.2018STRING_AGG
. ЕслиELSE
изменить на'blargh' + STRING_AGG(...)
, вы получите'blarghFrench and German...
, поэтому он неправильно объединяет второйSTRING_AGG
с первым. Простейший обходной путь — изменить выражениеELSE
наSTRING_AGG([Language] + '', ', ')
— это аннулирует CSE, предполагая наличие ошибки, из-за которой CSE игнорирует второй аргументSTRING_AGG
. - person Jeroen Mostert   schedule 27.09.2018