MySql 调查不同查询

MySql survey distinct query

大家好,我真的在为 MySql 查询而苦苦挣扎,我有一个名为 'info' 的 table,其中有一个名为 'rating' 的列,我评分在 1-10 之间。

现在我需要生成一个百分比值,表示 1-6、7-8 和 9-10 有多少评分,但我需要它们拼命显示,然后我需要第二个查询来减去百分比1-6 和 9-10 结果的值。

下面的查询与我从所有研究中得到的尽可能接近,但是我不知道如何只获得 1-6 的评级百分比而不是全部,也不知道如何获得第二个查询减去 1-6 和 9-10 评分百分比。

SELECT rating, 
   COUNT(*) AS Count, 
   (COUNT(*) / _total ) * 100 AS Percentege 
FROM info, 
   (SELECT COUNT(*) AS _total FROM info) AS myTotal 
GROUP BY rating

我不喜欢这个想法本身,但如果你需要你可以:

http://sqlfiddle.com/#!9/bd1c5/1

SELECT rating, 
   COUNT(*) AS Count, 
   (COUNT(*) /  COALESCE ((SELECT COUNT(*) AS _total FROM info),1) ) * 100 AS Percentege 
FROM info
GROUP BY rating

或者如果我们确定 table 不为空:

SELECT rating, 
   COUNT(*) AS Count, 
   (COUNT(*) /  (SELECT COUNT(*) FROM info) ) * 100 AS Percentege 
FROM info
GROUP BY rating

更新 更奇怪但要求的结果:

http://sqlfiddle.com/#!9/4b6bf/4

SELECT  
  IF(rating>=0 AND rating<=6, '1-6',
            IF(rating<=8,'7-8',
               IF(rating<=10,'9-10','UNKNOWN')
            )
          ) as pseudo_rating,
   COUNT(*) AS Count, 
   (COUNT(*) /  (SELECT COUNT(*) FROM info) ) * 100 AS Percentege 
FROM info
GROUP BY pseudo_rating

更新 ROUND()

http://sqlfiddle.com/#!9/4b6bf/6

SELECT  
  IF(rating>=0 AND rating<=6, '1-6',
            IF(rating<=8,'7-8',
               IF(rating<=10,'9-10','UNKNOWN')
            )
          ) as pseudo_rating,
   COUNT(*) AS Count, 
   ROUND((COUNT(*) /  (SELECT COUNT(*) FROM info) ) * 100, 2) AS Percentege 
FROM info
GROUP BY pseudo_rating
select if(rating between 1 and 6, '1-6', 
          if( rating between 7 and 8, '7-8',
              '9-10' )
          ) as rating_range,
          count(1) as num
from info 
group by rating_range

Working fiddle

编辑:添加舍入和计算 这可以用作子查询。给定group by你需要单独获取总金额:

select Q.rating_range, 
       Q.num,
       round(Q.num * 100 / Q.total, 2) as percent
from (
    select  R.*, 
        (select count(1) from info) as total
    from (
        select if(rating between 1 and 6, '1-6', 
                  if( rating between 7 and 8, '7-8',
                      '9-10' )
                  ) as rating_range,
                  count(1) as num
        from info 
        group by rating_range ) R
    ) Q
group by Q.rating_range

就相对值而言,如果我有一个外部应用程序,我可能会这样做。否则你可以做一个特定的查询我想:

select Q.rating_range, 
       Q.num,
       round(Q.num * 100 / Q.total, 2) as percent,      
       round( (Q.num - Q.total_nine_ten) * 100 / Q.total, 2) as diff_from_nine_ten      
from (
    select  R.*, 
        (select count(1) from info) as total,
        (select count(1) from info where rating > 8 ) as total_nine_ten
    from (
        select if(rating between 1 and 6, '1-6', 
                  if( rating between 7 and 8, '7-8',
                      '9-10' )
                  ) as rating_range,
                  count(1) as num
        from info 
        group by rating_range ) R
    ) Q 
group by Q.rating_range

Fiddle for version above

不是很优雅,但很管用