MySQL动态透视到包含日期和总和的C# GridView

jdg4fx2g  于 2022-10-31  发布在  Mysql
关注(0)|答案(1)|浏览(127)

我从MySQL数据库中获取了以下数据:

  1. +------------+------------+----------------+
  2. | competency | totalscore | date_evaluated |
  3. +------------+------------+----------------+
  4. | A | 0 | null |
  5. | B | 0 | null |
  6. | C | 0 | null |
  7. | D | 0 | null |
  8. | E | 5 | 2018-03-01 |
  9. | F | 4 | 2018-03-01 |
  10. | E | 4 | 2018-03-02 |
  11. | F | 3 | 2018-03-02 |
  12. +------------------------------------------+

从两个单独的表中检索

  1. +-----------------+
  2. | competencies |
  3. +-----------------+
  4. | competency_ID |
  5. | competency |
  6. +-----------------+
  7. +-----------------+
  8. | scoring_self |
  9. +-----------------+
  10. | student_ID |
  11. | competency_ID |
  12. | score |
  13. | date_evaluated |
  14. +-----------------+

我希望在.aspx页上以以下形式显示:

  1. +----------------+-------+-------+-------+-------+-------+--------+
  2. | Date Evaluated | A | B | C | D | E | F |
  3. +----------------+-------+-------+-------+-------+-------+--------+
  4. | 2018-03-01 | 0 | 0 | 0 | 0 | 5 | 4 |
  5. | 2018-03-02 | 0 | 0 | 0 | 0 | 4 | 3 |
  6. +-----------------------------------------------------------------+

如果用户尚未尝试,则分数为0,评估日期为空。我尝试创建一个动态透视表,因为能力的数量可以根据主题的不同而变化,使用以下准备好的语句。

  1. SET @mysql = NULL;
  2. SELECT
  3. GROUP_CONCAT(DISTINCT
  4. CONCAT('(CASE WHEN score IS NOT NULL THEN score ELSE 0 END) AS `',
  5. competency, '`')) INTO @mysql
  6. FROM (SELECT competency, scoring_self.score FROM competency LEFT JOIN
  7. scoring_self ON competency.competency_ID = scoring_self.competency_ID
  8. ORDER BY competency) AS sub;
  9. SET @mysql2= CONCAT('SELECT DISTINCT(DATE(ss.date_evaluated)) AS `Date
  10. Evaluated`, ' , @mysql,
  11. 'FROM competency c INNER JOIN scoring_self ss
  12. ON c.competency_ID = ss.competency_ID
  13. GROUP BY ss.date_evaluated;');
  14. PREPARE stmt FROM @mysql2;
  15. EXECUTE stmt;
  16. DEALLOCATE PREPARE stmt;

然而,我只设法得到它在下面的形式:

  1. +----------------+-------+-------+-------+-------+-------+--------+
  2. | Date Evaluated | A | B | C | D | E | F |
  3. +----------------+-------+-------+-------+-------+-------+--------+
  4. | 2018-03-01 | 5 | 5 | 5 | 5 | 5 | 5 |
  5. | 2018-03-02 | 4 | 4 | 4 | 4 | 4 | 4 |
  6. +-----------------------------------------------------------------+

它似乎只是从第一次约会的第一组分数,我不太清楚是什么出了问题。任何帮助将不胜感激!
另外,我不太确定在准备好的语句中何处放置WHERE子句,以便只检索单个学生的分数。

EDIT:我已经尝试了jQuery建议的更改,并做了一些自己的调整:

  1. SELECT
  2. GROUP_CONCAT(DISTINCT
  3. CONCAT('(CASE WHEN score IS NOT NULL THEN score ELSE 0 END) AS `', competency, '`')) INTO @mysql
  4. FROM
  5. (SELECT competency
  6. FROM competency
  7. LEFT JOIN scoring_self ON competency.competency_ID = scoring_self.competency_ID
  8. AND scoring_self.student_ID = <redacted>
  9. GROUP BY DATE(scoring_self.date_evaluated), competency) AS sub;

这将返回以下输出:

  1. +----------------+-------+-------+-------+-------+-------+--------+
  2. | Date Evaluated | A | B | C | D | E | F |
  3. +----------------+-------+-------+-------+-------+-------+--------+
  4. | 2018-03-01 | 5 | 5 | 5 | 5 | 5 | 5 |
  5. | 2018-03-01 | 4 | 4 | 4 | 4 | 4 | 4 |
  6. | 2018-03-02 | 4 | 4 | 4 | 4 | 4 | 4 |
  7. | 2018-03-02 | 3 | 3 | 3 | 3 | 3 | 3 |
  8. +-----------------------------------------------------------------+

看起来分数并没有Map到他们应该Map的列,原因我无法理解。
编辑2:

已解决由jQuery提供

最终的预准备语句应如下所示

  1. SET @mysql_dynamic = (
  2. SELECT
  3. GROUP_CONCAT( DISTINCT
  4. CONCAT(
  5. 'MAX(CASE WHEN competency = ''',
  6. competency,
  7. ''' AND competency IS NOT NULL THEN score ELSE 0 END) AS `',
  8. competency,
  9. '`'
  10. )
  11. )
  12. FROM (SELECT competency, scoring_self.score, student_ID FROM competency LEFT JOIN
  13. scoring_self ON competency.competency_ID = scoring_self.competency_ID
  14. ORDER BY competency) AS sub
  15. );
  16. SET @mysql = CONCAT('SELECT ss.date_evaluated, ', @mysql_dynamic, '
  17. FROM (SELECT date_evaluated, competency, scoring_self.score, scoring_self.student_ID FROM competency LEFT JOIN
  18. scoring_self ON competency.competency_ID = scoring_self.competency_ID
  19. ORDER BY competency) AS ss WHERE ss.date_evaluated IS NOT NULL AND ss.student_ID = \'',<redacted>,'\' GROUP BY date_evaluated DESC');
  20. PREPARE stmt FROM @mysql;
  21. EXECUTE stmt;
  22. DEALLOCATE PREPARE stmt;

以上提供了可按学生ID筛选的所需结果。

68de4m5k

68de4m5k1#

我想我们已经接近下面的代码了
这将为您提供所需的结果:

  1. SET @sql_dynamic = (
  2. SELECT
  3. GROUP_CONCAT( DISTINCT
  4. CONCAT(
  5. 'max(case when competency = ''',
  6. competency,
  7. ''' and competency is not null then score end) AS `',
  8. competency,
  9. '`'
  10. )
  11. )
  12. FROM (SELECT competency, scoring_self.score FROM competency LEFT JOIN
  13. scoring_self ON competency.competency_ID = scoring_self.competency_ID
  14. ORDER BY competency) AS sub
  15. );
  16. SET @sql = CONCAT('SELECT ss.date_evaluated,',
  17. @sql_dynamic, '
  18. FROM (SELECT date_evaluated, competency, scoring_self.score FROM competency LEFT JOIN
  19. scoring_self ON competency.competency_ID = scoring_self.competency_ID
  20. ORDER BY competency) AS ss WHERE ss.date_evaluated is not null
  21. GROUP BY date_evaluated DESC'
  22. );
  23. PREPARE stmt FROM @sql;
  24. EXECUTE stmt;
  25. DEALLOCATE PREPARE stmt;

在该代码中,分数现在已正确Map到能力。
最新消息:
找到了罪魁祸首,这是因为WHEN score IS NOT NULL THEN score ELSE 0,尝试删除您的第一个代码上的IS NOT NULLELSE 0,这应该Map列正确与您的代码。但请尝试先看到我的更新和测试运行。
最新消息:
这是你的代码,我调整了一点:

  1. SET @mysql = NULL;
  2. SELECT
  3. GROUP_CONCAT(DISTINCT
  4. CONCAT(
  5. 'max(case when competency = ''',
  6. competency,
  7. ''' and competency is not null then score else 0 end) AS `',
  8. competency,
  9. '`'
  10. )
  11. ) INTO @mysql
  12. FROM (SELECT competency, scoring_self.score FROM competency LEFT JOIN
  13. scoring_self ON competency.competency_ID = scoring_self.competency_ID
  14. ORDER BY competency) AS sub;
  15. SET @mysql2= CONCAT('SELECT DISTINCT(DATE(ss.date_evaluated)) AS `Date
  16. Evaluated`, ' , @mysql,
  17. 'FROM competency c INNER JOIN scoring_self ss
  18. ON c.competency_ID = ss.competency_ID
  19. GROUP BY ss.date_evaluated;');
  20. PREPARE stmt FROM @mysql2;
  21. EXECUTE stmt;
  22. DEALLOCATE PREPARE stmt;
展开查看全部

相关问题