2013-03-26 61 views
0

我想寫一個SQL查詢,我需要的分數> 3的縣數,然後在該列表上的縣,我需要產生一個百分比的房間分數< 3.所以我需要三列,縣名,由縣級得分> 3#,配有得分< 3%的縣SQL查詢與百分比和聚合函數

SELECT County = c.Description, [Score > 3] = count(s.Score), 
    ((select count(room.Name) where s.Score< 3) /(select count(room.Name)) * 100) 
    FROM Sites AS s 
    inner join Profiles as p on s.Profile_Id = p.Id 
    inner join Counties as c on p.County_Id = c.Id 
    inner join Rooms as room on s.Id = room.Site_Id 
    where s.Score > 3 
    Group By c.Description 
+0

你現在有什麼問題? – 2013-03-26 17:31:33

+0

問題是查詢。第三列,分數<3的房間的百分比...不能指出 – user1220099 2013-03-26 17:33:03

回答

0

我認爲你是在這個問題複雜化,而不是子查詢你可以限制使用HAVING子句返回的數據,然後在COUNT使用CASE

SELECT County = c.Description, 
     [Score > 3] = COUNT(CASE WHEN Sites.Score > 3 THEN 1 END), 
     [% Score < 3] = 100.0 * COUNT(CASE WHEN Sites.Score < 3 THEN 1 END)/COUNT(1) 
FROM Sites 
     INNER JOIN Profiles 
      ON Sites.Profile_Id = Profiles.Id 
     INNER JOIN Counties 
      ON Profiles.County_Id = Counties.Id 
     INNER JOIN Rooms 
      ON Sites.Id = Rooms.Site_Id 
GROUP BY c.Description 
HAVING COUNT(CASE WHEN Sites.Score > 3 THEN 1 END) > 0; 

Demo on SQL Fiddle

編輯

SELECT County = c.Description, 
     [Score > 3] = COUNT(CASE WHEN Sites.Score > 3 THEN 1 END), 
     [% Score < 3] = 100.0 * SUM(CASE WHEN Sites.Score < 3 THEN 1 END)/COUNT(*), 
     [Score > 3] = SUM(CASE WHEN Sites.Score > 3 THEN RoomCount ELSE 0 END), 
     [% Score < 3] = 100.0 * SUM(CASE WHEN Sites.Score < 3 THEN RoomCount ELSE 0 END)/SUM(RoomCount) 
FROM Sites 
     INNER JOIN Profiles 
      ON Sites.Profile_Id = Profiles.Id 
     INNER JOIN Counties 
      ON Profiles.County_Id = Counties.Id 
     INNER JOIN 
     ( SELECT Site_Id, RoomCount = COUNT(*) 
      FROM Rooms 
      GROUP BY Site_Id 
     ) Rooms 
      ON Sites.Id = Rooms.Site_Id 
GROUP BY c.Description 
HAVING COUNT(CASE WHEN Sites.Score > 3 THEN 1 END) > 0; 
+0

我認爲這是行得通的,我必須仔細檢查數字....在COUNT(1)中[1]表示[%分數<3]行代表什麼? – user1220099 2013-03-26 19:46:36

+0

如果一個網站有多個房間,並且網站的所有房間得分都相同,那麼如何獲得另一個具有分數<3的房間的列? – user1220099 2013-03-26 20:03:58

+0

使用'COUNT(1)'與COUNT(*)'相同,我甚至沒有這個意思。 'COUNT(*)'是相同和更清晰的。關於第二點,我不確定你在問什麼,我想我發佈的答案會給出所需的輸出。如果它沒有添加第二個查詢可能會有所幫助。 – GarethD 2013-03-26 20:22:26

0
[Score > 3] = count(s.Score) 

... 

where s.Score > 3 

不需要兩個語句。實際上,Where子句將所有操作限制爲s.score> 3,當您也嘗試從分數中提取數據時,這並不理想< 3.

如果您正在計算兩種情況,其中s.Score> 3以及它是< 3,您需要使用CASE語句

SELECT SUM(CASE WHEN s.score < 3 THEN 1 ELSE 0 END) AS Hiscores, 
SUM(CASE WHEN s.score > 3 THEN 1 ELSE 0 END) /count(s.scores) AS percentLowScores 

這應該這樣做

SELECT c.Description County, 
    SUM(CASE WHEN s.score < 3 THEN 1 ELSE 0 END) AS Hiscores, 
    SUM(CASE WHEN s.score > 3 THEN 1 ELSE 0 END) /count(s.scores) AS percentLowScores 

    FROM Sites AS s 
    inner join Profiles as p on s.Profile_Id = p.Id 
    inner join Counties as c on p.County_Id = c.Id 
    inner join Rooms as room on s.Id = room.Site_Id 

    Group By c.Description 
+0

只是命名該列,這是我需要的第二列。我需要三列數據 – user1220099 2013-03-26 17:36:19

+0

是第三列產生零和零? – 2013-03-26 17:38:25

0

使用Cast

SELECT County = c.Description, [Score > 3] = count(s.Score), 
    (Cast(select count(room.Name) where s.Score < 3) as float/(select count(room.Name)) * 100) 
    FROM Sites AS s 
    inner join Profiles as p on s.Profile_Id = p.Id 
    inner join Counties as c on p.County_Id = c.Id 
    inner join Rooms as room on s.Id = room.Site_Id 
    where s.Score > 3 
    Group By c.Description