5

各行に説明フィールドとブール値があるテーブルがあります。それぞれの説明でグループ化し、ブール値が真であった回数の割合を確認できるクエリを作成しようとしています。

表の例:

    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 を調整する方法がわかりません。

4

2 に答える 2

7

(MySQL でテストしました。同じ考えが SQLite に適用できるかどうかを確認してください。)

高齢者の数 (性別ごと) を見つけるには、ビットを数字として扱い、単純に合計します。

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をご覧ください。

于 2012-06-20T02:04:18.120 に答える
2

次のことを試してください。

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
于 2012-06-20T01:47:03.573 に答える