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