MySql枢轴没有压缩分组行

时间:2014-02-21 17:45:24

标签: mysql sql pivot pivot-table

我在完成此支点时遇到问题。我正在尝试各种各样的东西,但我似乎无法理解这一点。但是,由于我的运气通常会运行,我可能不得不再次重新开始。

我在这里看过stackoverflow,但似乎没有什么适合我的情况。尽管我可以告诉我所读到的其他问题是针对所有数字数据。我有一个数字和字符串的混合可能是问题,但我只需要更多的眼睛。

我正在编写一份报告,该报告将为系统中的每个用户显示一行,并显示他们每节课的分数。旋转列代表“课程模块”,并显示分数,“未开始”或“不完整”。

以下是一些查询的结果。这是正确的:

“结果”

+---------+-----------+--------------+-------------+
| user_id | module_id | total_failed | total_taken |
+---------+-----------+--------------+-------------+
|     605 |        89 |            0 |           0 |
|     605 |        90 |            0 |           0 |
|     605 |        91 |            0 |           0 |
|     606 |        89 |            2 |           3 |
|     606 |        90 |            1 |           4 |
|     606 |        91 |            0 |           0 |
|     634 |        89 |            0 |           3 |
|     634 |        90 |            0 |           4 |
|     634 |        91 |            0 |           0 |
+---------+-----------+--------------+-------------+

有了这个记录集我需要转动。

user_id将保留在第一列中,接下来的三列将转入用户的结果中,其中列数等于课程数。在此示例中,课程(模块)89,90和91将有三列。

我创建了一个函数"getModuleScore",它返回三个可能值中的一个:用户的分数(0.0 =< x =< 1.0),或两个文字之一:'not started'或'incomplete'。 (这是对这个函数的简单解释 - 它比我刚写的更多。)

如果我使用以下sql来旋转先前的结果(SQL中的“结果”表)

SELECT
    results.user_id AS user_id
    , 
        MAX(CASE WHEN module_id = 89
        THEN (SELECT getModuleScore(89, total_taken, total_failed))
        ELSE
            'not_started'
        END)
        AS `mod_89_score`
    , 
        MAX(CASE WHEN module_id = 90
        THEN (SELECT getModuleScore(90, total_taken, total_failed))
        ELSE
            'not_started'
        END)
        AS `mod_90_score`
    , 
        MAX(CASE WHEN module_id = 91
        THEN (SELECT getModuleScore(91, total_taken, total_failed))
        ELSE
            'not_started'
        END)
        AS `mod_91_score`

FROM
    results

GROUP BY 
    results.user_id
    , results.module_id

我收到以下记录集。

+---------+--------------+--------------+--------------+
| user_id | mod_89_score | mod_90_score | mod_91_score |
+---------+--------------+--------------+--------------+
|     605 | not started  | not_started  | not_started  |
|     605 | not_started  | not started  | not_started  |
|     605 | not_started  | not_started  | not started  |
|     606 | 0.333333333  | not_started  | not_started  |
|     606 | not_started  | 0.750000000  | not_started  |
|     606 | not_started  | not_started  | not started  |
|     634 | 1.000000000  | not_started  | not_started  |
|     634 | not_started  | 1.000000000  | not_started  |
|     634 | not_started  | not_started  | not started  |
+---------+--------------+--------------+--------------+

我想要的是:

+---------+--------------+--------------+--------------+
| user_id | mod_89_score | mod_90_score | mod_91_score |
+---------+--------------+--------------+--------------+
|     605 | not started  | not_started  | not_started  |
|     606 | 0.333333333  | 0.750000000  | not_started  |
|     634 | 1.000000000  | 1.000000000  | not_started  |
+---------+--------------+--------------+--------------+

我尝试了什么:

  1. 我已经重新调整了内部查询,以便为我提供正确的数据来计算
  2. 在MAX(),MIN()和SUM()
  3. 中包含CASE子句
  4. 删除了CASE子句中的ELSE,该子句在结果集
  5. 中提供了NULLS
  6. 更改了GROUP BY子句

1 个答案:

答案 0 :(得分:0)

@AgRizzo得到了它。

当我从res.module_id子句中删除GROUP BY时,结果就是我正在寻找的。