1

この sql クエリを書き直して、一致するものがない場合に対応する年齢範囲に 0 のレコードを表示するようにしたいと思います。この時点で「0」ではなく、メンバーの各値のパーセンテージをカウントするようにしたいのですが、誰でもできますどうすればこれを達成できますか?

SELECT COUNT(Name) * 100 / 
    (select COUNT(*) from 'cities'
    WHERE city= 'Hoeselt' AND Member = '0' ) AS 'perc', 
    CASE 
        WHEN age <= 30 THEN '18-30'
        WHEN age <= 50 THEN '31-50'
        ELSE '50+'
    END AS age, COUNT(*) AS n 
FROM 'cities' 
    WHERE city= 'Hoeselt' AND elected='yes' AND Member= '0'
    GROUP BY CASE
        WHEN age <= 30 THEN '18-30'
        WHEN age <= 50 THEN '31-50'
        ELSE '50+'
    END
4

2 に答える 2

0

これに対する私のアプローチは、CTE を使用して年齢層を定義することです。次に、すべての年齢層を「ドライバー」テーブルとして選択し、都市情報に結合したままにします。次に、一致がない場合でも年齢層があります。

with c as (
    select c.*,
           (CASE WHEN age <= 30 THEN '18-30'
                 WHEN age <= 50 THEN '31-50'
                 ELSE '50+'
             END) as agegrp
    from cities
   )
select COUNT(Name) * 100 / (select COUNT(*) from cities WHERE city= 'Hoeselt' AND Member = '0') as perc,
       driver.agegrp,
       COUNT(*) as n
from (select distinct agegrp from c) as driver left outer join
     c
     on driver.agegrp = c.agegrp
group by driver.agegrp   
于 2013-01-03T14:13:41.587 に答える
0

これが DDL なしで機能するかどうかはわかりません。これは、人々があなたに最適なソリューションを提供するのを支援するための優れたツールです。 http://sqlfiddle.com/#!6

;WITH AgeCat AS
(
    SELECT   MinAge = 18
            ,MaxAge = 30
            ,Descr  = '18-30'   UNION ALL
    SELECT 31, 49, '31-49'      UNION ALL
    SELECT 50, 200, '50+'
)
SELECT   DISTINCT
         C.Descr
        ,Perc   = COUNT(*) OVER (PARTITION BY 0) / COUNT(*) OVER (PARTITION BY A.Descr) * 100
FROM AgeCat A
JOIN Cities C   ON C.Age BETWEEN A.MinAge AND A.MaxAge
WHERE city = 'Hoeselt'
AND elected = 'yes'
AND Member = '0'
于 2013-01-03T13:43:27.247 に答える