2012-06-20 3 views
2

각 행에는 설명 필드와 부울 값이있는 테이블이 있습니다. 나는 각 개별 설명별로 그룹화 할 수있는 쿼리를 작성하려고 시도하고 부울이 참인 시간 비율을 확인합니다.SQL의 실제 열의 비율

예 테이블 :

PID Gender SeniorCitizen 
    1  M    1 
    2  M    1 
    3  F    0 
    4  F    1 
    5  M    0 

그리고 나는이를 반환하는 쿼리를 원하는 : 나는 대한 각각의 비율을 계산하는 쿼리를 가지고있는 점에있어

Gender SeniorPct 
     M   .66 
     F   .50 

을 남성 또는 여성 -하지만 한 번에 두 결과를 모두보고 싶습니다.

SELECT Gender, COUNT(*) * 1.0/
        (SELECT COUNT(*) FROM MyTable WHERE Gender='M') 
    FROM MyTable WHERE Gender='M' and SeniorCitizen=1; 

위의 내 외부 SELECT에서 "GROUP BY Gender"문을 닫습니다. 그러나 내부 SELECT를 조정하여 외부 SELECT를 조정 한 후에 올바른 결과를 얻는 방법을 알아낼 수 없습니다.

답변

5

노인의 수를 찾으려면 (당 성), 우리는 번호와 같은 비트를 치료하고 단순히를 요약 할 수 있습니다 : 그 바탕으로

SELECT 
    Gender, 
    SUM(SeniorCitizen) Seniors 
FROM MyTable 
GROUP BY Gender 

GENDER SENIORS 
M  2 
F  1 

, 우리는 쉽게 비율을 계산할 수 : 01,230,473을

SELECT 
    Gender, 
    SUM(SeniorCitizen)/COUNT(*) * 100 SeniorsPct 
FROM MyTable 
GROUP BY Gender 

GENDER SENIORSPCT 
M  66.6667 
F  50 
에서 재생할 수 있습니다.


업데이트 : SQLite에서도 매우 유사한 아이디어가 적용됩니다. 다른 SQL Fiddle을 살펴보십시오.

+0

좋은 답변입니다. 단순하고 테이블을 한 번만 검사합니다. –

2

는 다음과 같은 시도 : (. 같은 생각이 SQLite는에 적용 할 수 있을지는 MySQL의에서이 테스트를 확인하시기 바랍니다)

CREATE TABLE #MyTable 
(
    PID INT, 
    Gender VARCHAR(1), 
    SeniorCitizen BIT 
) 

INSERT INTO #MyTable 
(
    PID, 
    Gender, 
    SeniorCitizen 
) 
SELECT 1, 'M', 1 UNION 
SELECT 2, 'M', 1 UNION 
SELECT 3, 'F', 0 UNION 
SELECT 4, 'F', 1 UNION 
SELECT 5, 'M', 0 

SELECT 
    Gender, 
    COUNT(CASE WHEN SeniorCitizen = 1 THEN 1 END), -- Count of SeniorCitizens grouped by Gender 
    COUNT(1), -- Count of all users grouped by Gender 
    CONVERT(DECIMAL(2, 2), -- You can ignore this if you want 
     COUNT(CASE WHEN SeniorCitizen = 1 THEN 1 END) * 1.0/COUNT(1) -- Your ratio 
     ) 
FROM 
    #MyTable 
GROUP BY 
    Gender