【问题标题】:Count values that are grouped by beginvalue按 beginvalue 分组的计数值
【发布时间】:2017-02-23 13:25:46
【问题描述】:

我有一个数据库,其中有一列名为“StatusCode”。其中包含来自网站的所有状态代码。我想将所有具有相同开始值的状态码分组,并将它们一起计数。 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 |

当我将它们一起计算时,所有以 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


    【解决方案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'
    

    【讨论】:

    • 我有比那些 2 更多的 collums。现在它正在从其他列 (Id) 中获取其他值。
    • @jarlh 这是您只需要的 2 个列。但我会在我的例子中添加另一个。
    • @M.Arendsen,当您使用 GROUP BY 其他列时会产生巨大的影响...
    • @M.Arendsen 根据您的示例数据和预期输出,这是您需要的查询。如果它不能满足您的需求,请完善您的问题。
    • @M.Arendsen Yeh,我将忽略其他列,它们在输出中不是必需的,因此不应出现在代码中。我已将 count() 更改为 sum() 以总结您的 Count
    【解决方案2】:

    试试这个:

    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)
    

    您可以直接运行此查询进行检查,因为我以动态表为例来实现您的要求,然后您可以相应地修改您的查询。

    希望对您有所帮助。 :)

    【讨论】:

    • 谢谢,但这不是答案,每次有一个以“x”开头的值时,我都不需要计算。我需要计算状态码后面的值。
    【解决方案3】:

    我认为您需要这样的标量值函数:

    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 
    

    只需替换您的表名

    【讨论】:

    • 这是一个“。”代替 ”,” 。请再试一次。
    • 你应该只运行从“create function”到“end”的第一部分代码。
    • 谢谢,但这不是我要找的答案。这给出了与@Dheeraj Sharma 的回答相同(但更糟)的结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多