2012-06-20 2 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; 

Я пытаюсь добавьте инструкцию GROUP BY Gender в мой внешний SELECT, но я не могу понять, как настроить внутренний 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 
Смежные вопросы