SQL Server: как группировать по подстрокам
у меня есть следующая хранимая процедура для извлечения данных из таблицы. В таблице есть столбец "регион", который содержит значение типа "APAC: Китай" и т. д. для чего я использую функцию substring, чтобы удалить : и все после него.
ниже работает за исключением того, что он перечисляет все записи отдельно, а не группирует их по моей подстроке. Поэтому у меня есть, например, несколько элементов с регионом "APAC" вместо одного, все из которых отображаются ниже.
мой хранимая процедура:
CREATE PROCEDURE [dbo].[CountRegions]
AS
BEGIN
SET NOCOUNT ON;
SELECT SUBSTRING(region, 1, CHARINDEX(':', region) - 1) AS region,
COUNT(*) AS groupCount,
FROM SOPR_LogRequests
WHERE logStatus = 'active'
GROUP BY region
ORDER BY groupCount desc, region
FOR XML PATH('regions'), ELEMENTS, TYPE, ROOT('ranks')
END
мой результат:
<ranks>
<regions>
<region>APAC</region>
<groupCount>1</groupCount>
</regions>
<regions>
<region>EMEA</region>
<groupCount>1</groupCount>
</regions>
<regions>
<region>APAC</region>
<groupCount>1</groupCount>
</regions>
// ...
</ranks>
ожидаемый результат:
<ranks>
<regions>
<region>APAC</region>
<groupCount>2</groupCount>
</regions>
<regions>
<region>EMEA</region>
<groupCount>1</groupCount>
</regions>
// ...
</ranks>
может anyhone здесь помочь мне с этим ?
Спасибо за любую помощь, Тим.
1 ответов
код group by
не будет знать, ссылаетесь ли вы на базовый столбец или на вывод вашего кода функции (он будет предполагать базовый столбец), поэтому вам нужно повторить код в group by
:-
CREATE PROCEDURE [dbo].[CountRegions]
AS
BEGIN
SET NOCOUNT ON;
SELECT SUBSTRING(region, 1, CHARINDEX(':', region) - 1) AS region,
COUNT(*) AS groupCount,
FROM SOPR_LogRequests
WHERE logStatus = 'active'
GROUP BY SUBSTRING(region, 1, CHARINDEX(':', region) - 1)
ORDER BY groupCount desc, region
FOR XML PATH('regions'), ELEMENTS, TYPE, ROOT('ranks')
END