2015-09-26 167 views
1

我有数据,其中每行代表完整的审查中的一个句子。每一行都有一个分数(-1到1)。按多组的平均数计算

从这个角度来看,我目前制作了3个视图,每个视图按日,月或周分组,并且汇总了评论的平均得分,并计算其中有多少是正数,有多少是负数。

了从View例如每天查询:

SELECT 
`review_score_view`.`review_date` AS `review_date`, 
     COUNT(`review_score_view`.`review_id`) AS `review_count`, 
     (AVG(`review_score_view`.`score`) * 100) AS `average_score`, 
     SUM((CASE 
      WHEN (`review_score_view`.`score` >= 0) THEN 1 
      ELSE 0 
     END)) AS `positive_count`, 
     SUM((CASE 
      WHEN (`review_score_view`.`score` < 0) THEN 1 
      ELSE 0 
     END)) AS `negative_count` 
    FROM 
     `review_score_view` 
    GROUP BY `review_score_view`.`review_date` 

而且我得到结果是这样的:

| id | review_date | review_count | average_score | positive_count | negative_count | 
|-----|--------------|--------------|-----------------|----------------|----------------| 
| 521 | 2015-01-01 |  4  |  -25.0000 |  2   |  2   | 
| 519 | 2015-01-07 |  1  | -100.0000 |  0   |  1   | 
| 518 | 2015-01-25 |  1  |  100.0000 |  1   |  0   | 
| 516 | 2015-03-09 |  7  |  57.1429 |  6   |  1   | 
| 515 | 2015-04-26 |  2  |  -50.0000 |  1   |  1   | 
| 224 | 2015-06-01 |  68  |  -23.5294 |  40  |  28  | 
| 222 | 2015-06-02 |  26  | -100.0000 |  1   |  25  | 
| 221 | 2015-06-03 |  41  |  -36.5854 |  19  |  22  | 
| 220 | 2015-06-04 |  6  |  -50.0000 |  2   |  4   | 

问题:我怎样才能从这些视图结果另一个查询基础上平均得分。对于每个结果(分数类别),根据分组,每月,每周或每天,我想得到这5个结果的总和。看起来像一个容易的事情,但我无法绕过它。

SUM((CASE 
    WHEN (average_score >= 75) THEN 1 
    ELSE 0 
END)) AS very_positive, 
SUM((CASE 
    WHEN (average_score between 4 and 74) THEN 1 
    ELSE 0 
    END)) AS positive, 
SUM((CASE 
    WHEN (average_score between -5 and 5) THEN 1 
     ELSE 0 
    END)) AS neutral, 
SUM((CASE 
    WHEN (average_score between -4 and -74) THEN 1 
     ELSE 0 
    END)) AS negative, 
SUM((CASE 
    WHEN (average_score <= -75) THEN 1 
     ELSE 0 
END)) AS very_negative 

最后我只是绘制数据。在Excel中制作简单的例子:

Pie

在此先感谢。

回答

0

嗯。它看起来像你想要的结果在行中,而不是列。这表明group by

SELECT (CASE WHEN average_score >= 75 THEN 'VeryPositive' 
      WHEN average_score >= 4 THEN 'Positive' 
      WHEN average_score >= -5 THEN 'Neutral' 
      WHEN average_score >= -74 THEN 'Negative' 
      ELSE 'VeryNegative' 
     END) as ScoreGroup, 
     COUNT(*) as cnt 
FROM dailyview v 
GROUP BY ScoreGroup 
ORDER BY ScoreGroup; 

注:case返回匹配的第一个表达式,所以between是不必要的。

+0

非常感谢,正是我期待的! – Vaelyr