2012-06-20 61 views
2

我有一個表,其中每行都有一個描述字段以及一個布爾值。我試圖寫一個查詢,我可以按照各自的描述進行分組,並查看布爾值爲true的時間百分比。真正列的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外部SELECT中包含一個「GROUP BY Gender」語句,但我似乎無法弄清楚如何調整內部SELECT以在調整外部SELECT之後獲得正確結果。

回答

5

爲了找到老人的數量(每性別),我們可以把位數字和簡單總結起來:

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

GENDER SENIORS 
M  2 
F  1 

此基礎上,我們可以很容易地計算出百分比:

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

GENDER SENIORSPCT 
M  66.6667 
F  50 

你可以在這裏玩SQL Fiddle


更新:非常類似的想法也適用於SQLite。請看看另一個SQL Fiddle

+0

很好的答案。簡單,只掃描一次表格。 –

2

嘗試以下方法:(我測試這個MySQL下,請檢查是否同樣的想法可以應用於SQLite的)

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