Количество значений, сгруппированных по начальному значению

У меня есть база данных с столбцом «StatusCode». В нем есть все коды состояния с веб-сайта. Я хочу сгруппировать все статусные коды с одинаковым начальным значением и подсчитать их вместе. См. Эту страницу со всеми кодами состояния . Значение в базе данных выглядит следующим образом:

+--Id--++--Systemlogid--+--StatusCode--+-Count-+
|  1   |      1         |    404       |  200  |
|  2   |      1         |    403       |  200  | // values in the database
|  3   |      1         |    500       |  300  |
|  4   |      1         |    501       |  300  |
+------+----------------+--------------+-------+

Значения в части Count представляют собой сумму всех значений с одним и тем же стартом состояния.

Как вы видели выше, моя база данных содержит:

| 1 | 1 | 404 | 200 |
| 2 | 1 | 403 | 200 |

Когда я считаю их вместе, все коды состояния с 4 в начале я получаю значение 400 (200 + 200)

Моя база данных также поддерживает эти значения:

| 1 | 1 | 500 | 300 |
| 2 | 1 | 501 | 300 |

Когда я считаю их вместе, все коды состояния с 5 в начале я получаю значение 600 (300 + 300)

Что дает таблица:

+--StatusCode--+-Count-+
|    4xx       |  400  |
|    5xx       |  600  |
+--------------+-------+

Итак: 1xx - это все статусные коды, начинающиеся с 1. 2xx - это все коды состояния, начинающиеся с 2. 3xx - это все коды состояния, начинающиеся с 3 и т. Д. Как я могу это сделать?

sql,sql-server,

0

Ответов: 3


1 принят

В ролях и группах ...

select left(cast(statuscode as varchar(3)),1) + 'xx' as StatCode, 
       sum([Count]) as Counted
from Table1
group by left(cast(statuscode as varchar(3)),1) + 'xx'

0

Попробуй это:

DECLARE @newtable TABLE
( id INT IDENTITY(1,1),
value INT )

    INSERT INTO @newtable VALUES(1000),(2231),(2112),(2007),
(3002),(3001),(4322),(4321),(4326),(4327),(43299)

SELECT SUBSTRING(CONVERT(NVARCHAR,value),1,1)+'xx' AS 'StatusCode',
COUNT(SUBSTRING(CONVERT(NVARCHAR,value),1,1)) AS 'Count'
    FROM @newtable GROUP BY SUBSTRING(CONVERT(NVARCHAR,value),1,1)

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

Надеюсь, поможет. :)


0

Я думаю, вам нужна скалярнозначная функция:

CREATE FUNCTION [dbo].[GetCountOfstatus]
(
    @StatusCode NVARCHAR(3) 
)
RETURNS int
AS
BEGIN
    DECLARE @res int
    SET @res = (SELECT COUNT(*) FROM Table1 WHERE LEFT(cast(StatusCode AS NVARCHAR(3)) , 1) = LEFT(@StatusCode,1) )
    RETURN @res
END

после создания функции вы можете использовать его следующим образом:

SELECT * , 
        LEFT(StatusCode,1) +'XX' AS Code ,  
        [dbo].[GetCountOfstatus](StatusCode) AS CodeCount  
FROM TABLE1 

просто замените имя таблицы

SQL, SQL-сервер,
Похожие вопросы