我有一个名为" StatusCode"的列的数据库。在网站上有所有状态代码。我想将所有状态代码分组为相同的begin-value,并将它们计算在一起。 See this page with all the status codes。数据库中的值如下:
+--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部分中的值将是具有相同statuscode-begin的所有值的总和。
如上所示,我的数据库包含:
| 1 | 1 | 404 | 200 |
| 2 | 1 | 403 | 200 |
当我将它们统计在一起时,所有状态代码在开始时我得到值400(200 + 200)
我的数据库也包含了这些值:
| 1 | 1 | 500 | 300 |
| 2 | 1 | 501 | 300 |
当我统计这些时,所有状态代码在开头我得到的值为600(300 + 300)
表格的内容:
+--StatusCode--+-Count-+
| 4xx | 400 |
| 5xx | 600 |
+--------------+-------+
所以:1xx都是以1开头的状态代码.2xx是以2开头的所有状态代码.3xx都是以3开头的状态代码等。我该怎么办?此?
答案 0 :(得分: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'
答案 1 :(得分: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)
您可以直接运行此查询来检查,因为我已经使用动态表来实现您所需的示例,然后您可以相应地修改您的查询。
希望它有所帮助。 :)
答案 2 :(得分: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
只需替换你的表名