计算按beginvalue分组的值

时间:2016-10-14 07:41:57

标签: sql sql-server

我有一个名为" 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开头的状态代码等。我该怎么办?此?

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 

只需替换你的表名