【问题标题】:Calculate percentages in SQL based on data in the same column, for every two rows?每两行根据同一列中的数据计算SQL中的百分比?
【发布时间】:2017-08-03 17:26:20
【问题描述】:

对于下面的视图,我需要计算每天的错误百分比。如何将每两行合并为一行,显示每对总数中 404 错误的百分比?

    DATE    |    STATUS     |    TOTAL    

 2017-01-01   200 OK            250
 2017-01-01   404 NOT FOUND     180
 2017-01-02   200 OK            700
 2017-01-02   404 NOT FOUND     25

我想将其返回为:

    DATE    |    ERRORS (percent)     

 2017-01-01      41.8
 2017-01-02      3.4

我尝试了各种括号和计数,但我尝试的所有操作都会引发不同的语法错误,或者最终挂起而不返回任何内容。

我昨天开始学习 SQL - 我已经看到了将两行合并为一行的类似问题,但对于这种 两行合并的特殊情况,我似乎找不到一个。 p>

谢谢!

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    试试这样的:

    Select DATE
     , SUM ( 
     CASE WHEN STATUS IN ('404 NOT FOUND', 'OTHER ERROR STATUSES' ) 
     THEN 1 ELSE 0 END ) -- NUMERATOR - Counts Any Errors
     / 
    ( COUNT(*) * 1.0 ) -- DENOMINATOR - Counts All Rows 
    AS ERRORS   
    FROM TABLE
    GROUP BY DATE
    

    【讨论】:

      【解决方案2】:

      您可以创建一个通用表表达式 (CTE) 来计算每天的总数,然后将其加入仅过滤为“404 NOT FOUND”的表中

      WITH CTE
      AS
      (
      SELECT
      DATE,
      SUM(TOTAL) as day_total
      FROM Table
      GROUP BY DATE
      )
      SELECT 
      T1.DATE,
      (T1.TOTAL/CTE.day_total) AS ERRORS
      FROM Table AS T1
      LEFT JOIN CTE ON T1.DATE=CTE.DATE
      WHERE T1.STATUS='404 NOT FOUND';
      

      【讨论】:

        【解决方案3】:

        我试过这样的,

        SELECT DATE, (SELECT COUNT(*) FROM TABLE WHERE STATUS IN ('404 NOT FOUND', 
        'OTHER ERROR STATUSES')) * 1.0 / COUNT(*) * 100 AS ERRORS_PERCENT  
        FROM TABLE
        GROUP BY DATE;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-16
          • 2021-09-13
          • 2020-03-11
          • 2017-02-15
          • 2015-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多