按多个组的平均值计算

时间:2015-09-26 14:10:01

标签: mysql database

我有数据,每行代表完整评论中的一个句子。每行都有一个分数(-1到1)。

从这个观点来看,我目前制作了3个观点,其中每个观点都有不同的分组,按日,月或周,并汇总评论的平均分数和 计算其中有多少是正数,多少是负数。

例如来自视图的日常查询:

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

提前致谢。

1 个答案:

答案 0 :(得分: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是不必要的。