【问题标题】:MySql survey distinct queryMySql 调查不同的查询
【发布时间】:2015-10-09 16:14:33
【问题描述】:

嘿,伙计们,我真的在为 MySql 查询苦苦挣扎,我有一个名为“info”的表,其中有一个名为“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

【问题讨论】:

  • 我会做一个简单的 GROUP BY 评级查询并在 PHP 中处理结果数组以获得我需要的评级百分比。
  • 好吧,不知道怎么解释,但是按功能分组不确定这是否可行。
  • 你检查我的答案了吗?

标签: php mysql survey


【解决方案1】:
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

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

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

不是很优雅,但很有效

【讨论】:

  • 是的,差不多了,我只需要它有一个四舍五入的百分比值,还有一个问题,我如何才能用 9-10 减去 1-6 级的百分比值?跨度>
  • 需要询问我的 Dreamweaver 是否在我添加记录集时从第 2 行给出错误提示,但它在 phpmyadmin 中运行良好,有什么想法吗?
  • 抱歉,没用过 Dreamweaver 所以不知道。
  • 它说 MySql 不支持该版本的任何想法我可以更改您的语法以使其正常工作确切的错误是“mysql Error#: 1064 You have an error in your SQL语法;查看与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 2 行的 ') Q group by rating range' 附近使用"
【解决方案2】:

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

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

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

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

【讨论】:

  • 表格如下所示:-------------------- |评级 | |-------------------| | | 10 | | 8 | | 10 | | 8 | | 9 | | 2 | | 2 | | 4 | | 4 | | 8 | -------------------- 期望的结果是评分 9-10 = 30%
  • @DanielSmit 你试过我的查询了吗?你访问过我的 sqlfiddle 吗?
  • 您提交的所有结果都与我的相同,但是我需要将结果分开并按等级 1-6 和 7-8 和 9-10 分组...
  • 谢谢最后一个问题,我怎样才能将百分比结果四舍五入并用 9-10 减去百分比结果 1-6...提前谢谢你的老板,我真的很挣扎.. .
  • @DanielSmit 检查round() 函数。答案已更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
相关资源
最近更新 更多