>

각 항목의 총 개수 백분율을 설명 순서대로 표시하려는 항목 열이있는 SQL 테이블이 있습니다.

예를 들어

Column A
Item 1
Item 1
Item 2
Item 3

표시하고 싶습니다 :

Column A
Item 1   0.5
Item 2   0.25
Item 3   0.25

지금까지 나는 다음을 시도했다 :

SELECT [Column A], (count([Column A]) / count(*))
  FROM [table]
  GROUP BY [Column A]
  Order by (count([Column A]) / count(*)) DESC

그러나 모든 것이 1로 돌아옵니다.

  • 답변 # 1

    COUNT 를 시도해 볼 수 있습니다   [Column A] 의 그룹  기본 쿼리의 colunm. 그런 다음 총 count 를  하위 쿼리에서 나누기.

    CREATE TABLE T(
       [Column A] VARCHAR(50)
    ); 
    INSERT INTO T VALUES ('Item 1');
    INSERT INTO T VALUES ('Item 1');
    INSERT INTO T VALUES ('Item 2');
    INSERT INTO T VALUES ('Item 3');
    SELECT [Column A],COUNT(*) /CAST ((SELECT COUNT(*) FROM T) AS FLOAT)
    FROM T 
    GROUP BY [Column A]
    
    

    sqlfiddle

    또는 CROSS JOIN 를 사용할 수 있습니다  총합을 구한 다음 나누십시오.

    SELECT [Column A],COUNT(*) /CAST(total AS FLOAT)
    FROM T CROSS JOIN (SELECT COUNT(*) total FROM T) v
    GROUP BY [Column A],total
    
    

  • 답변 # 2

    문제는 집계가 그룹 열에 적용된다는 것입니다. 어떤 방식 으로든 합계를 별도로 가져와야합니다. 한 가지 방법은 @ D-Shih와 같이 파생 테이블을 사용하는 것입니다. 변수에 변수를 저장하려고합니다.

    또 다른 문제는 두 피연산자가 모두 INT이므로 SQL Server가 결과에 대한 INT의 데이터 유형을 유추한다는 것입니다. 정수 데이터 유형을 리턴하지 않으려면 피연산자 중 하나만 필요합니다. 근사 숫자는 나중에 100 %를 얻기 위해 개별 %를 합산해야 할 경우 문제를 일으킬 수 있으므로 정확한 숫자 데이터 유형을 사용했습니다.

    DECLARE @t_item TABLE
    (       name VARCHAR(10)
    )
    DECLARE @total_count NUMERIC(3,2)
    INSERT INTO @t_item
    VALUES ('ITEM1'),
           ('ITEM1'),
           ('ITEM2'),
           ('ITEM3'),
           ('ITEM3'),
           ('ITEM1')
    SELECT @total_count = COUNT(*) FROM @t_item
    SELECT name,
           COUNT(name),
           COUNT(*),
           pct_of_all      = CONVERT(NUMERIC(3,2),COUNT(name))/CONVERT(NUMERIC(3,2),COUNT(*))
      FROM @t_item
     GROUP BY name
    
    SELECT name,
           COUNT(name),
           @total_count,
           pct_of_all      = COUNT(name)/@total_count
      FROM @t_item
     GROUP BY name
    
    

  • 답변 # 3

    테이블을 한 번 읽으므로 Window 함수가 이런 종류의 경우에 더 나은 솔루션이라고 생각합니다.

    단일 백분율 대신 백분율, 평균 및 합계를 작성해야합니까? 아니면 쿼리가 단일 카운트보다 더 복잡합니까? 많은 하위 쿼리를 작성하는 것은 옵션이 아닙니다. 따라서 이것이 하위 쿼리보다 창 기능을 선호하는 이유입니다.

    dbfiddle

    CREATE TABLE T(
       [Column A] VARCHAR(50)
    ); 
    INSERT INTO T VALUES ('Item 1');
    INSERT INTO T VALUES ('Item 1');
    INSERT INTO T VALUES ('Item 2');
    INSERT INTO T VALUES ('Item 3');
    SELECT
       [Column A], CNT / SUM(CNT) OVER () PERC
    FROM (
      SELECT [Column A], CAST(COUNT(*) AS NUMERIC) CNT
      FROM T 
      GROUP BY [Column A]
    ) X
    ORDER BY PERC
    
    

관련 자료

  • 이전 windows - c ++ - sha256 다이제스트를 openssl bignum으로 효율적으로 가져 옵니까?
  • 다음 Delphi application - 델파이 응용 프로그램 - windows 8에서 windows 키 차단 (시작)