복붙노트

[SQL] 같은 SELECT SQL 쿼리에서 SUM ()에서 계산 비율

SQL

같은 SELECT SQL 쿼리에서 SUM ()에서 계산 비율

테이블 my_obj에서 두 개의 정수 필드가 있습니다 :

(value_a integer, value_b integer);

나는 얼마나 많은 시간 value_a = value_b 계산하려고, 나는 퍼센트에서이 비율을 표현하고 싶다. 이것은 내가 시도 코드입니다 :

select sum(case when o.value_a = o.value_b then 1 else 0 end) as nb_ok,
       sum(case when o.value_a != o.value_b then 1 else 0 end) as nb_not_ok,
       compute_percent(nb_ok,nb_not_ok)
from  my_obj as o
group by o.property_name;

compute_percent 단순히 (a * 100) / (A + B의)이다 않는 stored_procedure

그러나 PostgreSQL은 열 nb_ok이 존재하지 않는다고 불평한다. 어떻게 제대로 그렇게 할 것인가?

우분투 12.04와 PostgreSQL을 9.1을 사용합니다.

해결법

  1. ==============================

    1.이 보일 수보다이 질문에 대한 더 있습니다.

    이 보일 수보다이 질문에 대한 더 있습니다.

    이 훨씬 빠르고 간단합니다 :

    SELECT property_name
          ,(count(value_a = value_b OR NULL) * 100) / count(*) AS pct
    FROM   my_obj
    GROUP  BY 1;
    

    결과:

    property_name | pct
    --------------+----
     prop_1       | 17
     prop_2       | 43
    

    어떻게?

    (소수 자리와 함께)를 사용하여 100.0 숫자로 계산을 강제함으로써, 소수점 이하를 유지한다. 이 ()로 라운드 사용할 수 있습니다 :

    SELECT property_name
          ,round((count(value_a = value_b OR NULL) * 100.0) / count(*), 2) AS pct
    FROM   my_obj
    GROUP  BY 1;
    

    결과:

    property_name | pct
    --------------+-------
     prop_1       | 17.23
     prop_2       | 43.09
    

    여담으로: 내가 대신 valueA의 value_a를 사용합니다. PostgreSQL을에 인용 부호가 혼합 된 경우 식별자를 사용하지 마십시오. 나는이 어리 석음에서 오는 너무 많은 절망적 인 질문을 보았다. 당신은 내가에 대해 이야기하고 무엇을 궁금해하는 경우, 설명서의 장 식별자 및 핵심 단어를 읽어 보시기 바랍니다.

  2. ==============================

    2.아마 가장 쉬운 방법은 절과 함께 사용하는 것입니다

    아마 가장 쉬운 방법은 절과 함께 사용하는 것입니다

    WITH data 
         AS (SELECT Sum(CASE WHEN o.valuea = o.valueb THEN 1 ELSE 0 END) AS nbOk, 
                    Sum(CASE WHEN o.valuea != o.valueb THEN 1 ELSE 0 END) AS nbNotOk, 
             FROM   my_obj AS o 
             GROUP  BY o.property_name) 
    SELECT nbok, 
           nbnotok, 
           Compute_percent(nbok, nbnotok) 
    FROM   data
    
  3. ==============================

    3.또한이 버전을 시도 할 수 있습니다 :

    또한이 버전을 시도 할 수 있습니다 :

    WITH all(count) as (SELECT COUNT(*)
                        FROM my_obj),
         matching(count) as (SELECT COUNT(*)
                             FROM my_obj
                             WHERE valueA = valueB)
    SELECT nbOk, nbNotOk, Compute_percent(nbOk, nbNotOk)
    FROM (SELECT matching.count as nbOk, all.count - matching.count as nbNotOk
          FROM all
          CROSS JOIN matching) data
    
  4. from https://stackoverflow.com/questions/15644713/compute-percents-from-sum-in-the-same-select-sql-query by cc-by-sa and MIT license