2013-03-26 208 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