В ролях и группах ...
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'
У меня есть база данных с столбцом «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 и т. Д. Как я могу это сделать?
Попробуй это:
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)
Вы можете напрямую запустить этот запрос, чтобы проверить, как я использовал динамическую таблицу для достижения того, что вам нужно в качестве примера, и затем вы можете изменить свой запрос.
Надеюсь, поможет. :)
Я думаю, вам нужна скалярнозначная функция:
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
просто замените имя таблицы