2013-01-03 93 views
1

我想重寫這個SQL查詢,以便他顯示一個記錄,如果沒有匹配,並且我希望他計算每個成員值的百分比而不是現在的'0',任何人都可以幫我實現這個目標嗎?計算列的每個值的百分比sql

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 

回答

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' 
+0

THX,將嘗試;) – user735646

+0

COUNT(*)OVER(PARTITION BY 0)/ COUNT(*)OVER(PARTITION BY A.Descr) * 100改爲COUNT(*)OVER(PARTITION BY 0)/ COUNT(*)OVER(PARTITION BY C.Descr)* 100.對不起。再試一次 – MarkD

+1

我認爲你可以使用'OVER()'而不是'OVER(PARTITION BY 0)' –

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