2009-02-22 60 views
4

好吧,我一直在努力,現在解決這個約2小時...請指教:使用複雜的SQL查詢覆蓋百分比...?

表:

PROFILE [id (int), name (varchar), ...] 
SKILL [id (int), id_profile (int), id_app (int), lvl (int), ...] 
APP  [id (int), ...] 

拉特基本上可以從0到3

我試圖獲得這個特定的統計數據: 「至少有兩個擁有2或更高技能的人所覆蓋的應用的百分比是多少?」

非常感謝

回答

4
SELECT AVG(covered) 
FROM (
    SELECT CASE WHEN COUNT(*) >= 2 THEN 1 ELSE 0 END AS covered 
    FROM app a 
    LEFT JOIN skill s ON (s.id_app = a.id AND s.lvl >= 2) 
    GROUP BY a.id 
) 

MySQL更有效的方式:

SELECT AVG 
     (
     IFNULL 
     (
      (
      SELECT 1 
      FROM skill s 
      WHERE s.id_app = a.id 
      AND s.lvl >= 2 
      LIMIT 1, 1 
      ), 0 
     ) 
     ) 
FROM app a 

這會停止,因爲它找到每個app第二熟練person一旦計數。

如果你有幾個app但很多person的有效率。

+0

很好!我從來沒有想過用平均水平。 – Rory 2009-02-23 00:18:08

-1
SELECT SUM(CASE lvl WHEN 3 THEN 1 WHEN 2 THEN 1 ELSE 0 END)/SUM(1) FROM SKILL 

如果你的數據庫中有一個的if/then功能的CASE而是使用。例如,在MySQL:

SELECT SUM(IF(lvl >= 2, 1, 0))/SUM(1) FROM SKILL 
+0

這個計數技能而不是應用程序。 – Rory 2009-02-23 00:12:45

0

未經測試

select convert(float,count(*))/(select count(*) from app) as percentage 
from (
    select count(*) as number 
    from skill 
    where lvl >= 2 
    group by id_app) t 
where t.number >= 2 
-1

我不知道這是比任何tvanfosson的回答是好還是壞,但在這裏它是無論如何:

SELECT convert(float, count(*))/(Select COUNT(id) FROM APP) AS percentage 
FROM APP INNER JOIN SKILL ON APP.id = SKILL.id 
WHERE (
    SELECT COUNT(id) 
    FROM SKILL AS Skill2 WHERE Skill2.id_app = APP.id and lvl >= 2 
) >= 2 
+0

你內心的加入技巧將意味着你不止一次地計算應用程序。您只需計算一次合格的應用程序。 – Rory 2009-02-23 00:14:37

0

邏輯是:百分比= 100 *(感興趣的應用的數量)/(應用的總數)

select 'percentage' = 
-- 100 times 
    (cast(100 as float) * 
-- number of apps of interest 
    (select count(id_app) 
    from (select id_app, count(*) as skilled_count 
      from skill 
      where lvl >= 2 
      group by id_app 
      having count(*) >= 2) app_counts) 
-- divided by total number of apps 
/(select count(*) from app) 

轉換爲浮點數是需要的,所以sql不只是做整數算術。