首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有日期和和的MySQL动态轴到C# GridView

问带有日期和和的MySQL动态轴到C# GridView
EN

Stack Overflow用户
提问于 2018-03-02 06:28:56
回答 1查看 146关注 0票数 0

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

代码语言:javascript
复制
+------------+------------+----------------+
| competency | totalscore | date_evaluated |
+------------+------------+----------------+
|     A      |      0     |     null       |
|     B      |      0     |     null       |
|     C      |      0     |     null       |
|     D      |      0     |     null       |
|     E      |      5     |   2018-03-01   |
|     F      |      4     |   2018-03-01   |
|     E      |      4     |   2018-03-02   |
|     F      |      3     |   2018-03-02   |
+------------------------------------------+

从两个单独的表中检索到

代码语言:javascript
复制
+-----------------+
|  competencies   | 
+-----------------+
|  competency_ID  |
|  competency     |
+-----------------+

+-----------------+
|  scoring_self   | 
+-----------------+
|  student_ID     |
|  competency_ID  |
|  score          |
|  date_evaluated |
+-----------------+

我想以以下形式在.aspx页面上显示:

代码语言:javascript
复制
+----------------+-------+-------+-------+-------+-------+--------+
| Date Evaluated |   A   |   B   |   C   |   D   |   E   |   F    |
+----------------+-------+-------+-------+-------+-------+--------+
| 2018-03-01     |   0   |   0   |   0   |   0   |   5   |   4    |
| 2018-03-02     |   0   |   0   |   0   |   0   |   4   |   3    |
+-----------------------------------------------------------------+

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

代码语言:javascript
复制
SET @mysql = NULL;

SELECT
GROUP_CONCAT(DISTINCT
CONCAT('(CASE WHEN score IS NOT NULL THEN score ELSE 0 END) AS `',
competency, '`')) INTO @mysql
FROM (SELECT competency, scoring_self.score FROM competency LEFT JOIN
scoring_self ON competency.competency_ID = scoring_self.competency_ID
ORDER BY competency) AS sub;


SET @mysql2= CONCAT('SELECT DISTINCT(DATE(ss.date_evaluated)) AS `Date
Evaluated`, ' , @mysql, 
'FROM competency c INNER JOIN scoring_self ss
ON c.competency_ID = ss.competency_ID
GROUP BY ss.date_evaluated;');

PREPARE stmt FROM @mysql2;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

但是,我只设法以以下形式获得了它:

代码语言:javascript
复制
+----------------+-------+-------+-------+-------+-------+--------+
| Date Evaluated |   A   |   B   |   C   |   D   |   E   |   F    |
+----------------+-------+-------+-------+-------+-------+--------+
| 2018-03-01     |   5   |   5   |   5   |   5   |   5   |   5    |
| 2018-03-02     |   4   |   4   |   4   |   4   |   4   |   4    |
+-----------------------------------------------------------------+

这似乎只是从第一次约会开始的第一组分数,我不太确定到底出了什么问题。任何帮助都将不胜感激!

另外,我不太确定在准备好的语句中放置where子句的位置,以便只检索单个学生的分数。

编辑:我尝试了jQuery建议的更改,并做了一些调整:

代码语言:javascript
复制
SELECT
    GROUP_CONCAT(DISTINCT
                     CONCAT('(CASE WHEN score IS NOT NULL THEN score ELSE 0 END) AS `', competency, '`')) INTO @mysql
FROM 
    (SELECT competency 
     FROM competency 
     LEFT JOIN scoring_self ON competency.competency_ID = scoring_self.competency_ID 
                            AND scoring_self.student_ID = <redacted>
     GROUP BY DATE(scoring_self.date_evaluated), competency) AS sub;

这将返回以下输出:

代码语言:javascript
复制
+----------------+-------+-------+-------+-------+-------+--------+
| Date Evaluated |   A   |   B   |   C   |   D   |   E   |   F    |
+----------------+-------+-------+-------+-------+-------+--------+
| 2018-03-01     |   5   |   5   |   5   |   5   |   5   |   5    |
| 2018-03-01     |   4   |   4   |   4   |   4   |   4   |   4    |
| 2018-03-02     |   4   |   4   |   4   |   4   |   4   |   4    |
| 2018-03-02     |   3   |   3   |   3   |   3   |   3   |   3    |
+-----------------------------------------------------------------+

似乎分数不是映射到列,他们应该是出于我无法理解的原因。

编辑2:

解决了jQuery的礼貌问题

最后准备好的语句应该如下所示

代码语言:javascript
复制
SET @mysql_dynamic = (
    SELECT
        GROUP_CONCAT( DISTINCT
            CONCAT(
                 'MAX(CASE WHEN competency = ''',
      competency,
      ''' AND competency IS NOT NULL THEN score ELSE 0 END) AS `',
      competency,
      '`'
            )
        )
    FROM (SELECT competency, scoring_self.score, student_ID FROM competency LEFT JOIN
scoring_self ON competency.competency_ID = scoring_self.competency_ID 
ORDER BY competency) AS sub
);

SET @mysql = CONCAT('SELECT ss.date_evaluated, ', @mysql_dynamic, ' 
FROM (SELECT date_evaluated, competency, scoring_self.score, scoring_self.student_ID FROM competency LEFT JOIN
scoring_self ON competency.competency_ID = scoring_self.competency_ID 
ORDER BY competency) AS ss WHERE ss.date_evaluated IS NOT NULL AND ss.student_ID = \'',<redacted>,'\' GROUP BY date_evaluated DESC');

PREPARE stmt FROM @mysql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

上述内容提供了学生ID可过滤的预期结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-02 06:37:31

我想我们已经接近下面的代码了

这将给您希望的结果:

代码语言:javascript
复制
SET @sql_dynamic = (
    SELECT
        GROUP_CONCAT( DISTINCT
            CONCAT(
                 'max(case when competency = ''',
      competency,
      ''' and competency is not null then score end) AS `',
      competency,
      '`'
            )
        )
    FROM (SELECT competency, scoring_self.score FROM competency LEFT JOIN
scoring_self ON competency.competency_ID = scoring_self.competency_ID
ORDER BY competency) AS sub
);

SET @sql = CONCAT('SELECT ss.date_evaluated,', 
              @sql_dynamic, ' 
           FROM (SELECT date_evaluated, competency, scoring_self.score FROM competency LEFT JOIN
scoring_self ON competency.competency_ID = scoring_self.competency_ID
ORDER BY competency) AS ss WHERE ss.date_evaluated is not null
           GROUP BY date_evaluated DESC'
       );
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

在该代码上,分数现在被正确地映射到能力。

更新:

找到了罪魁祸首,正是因为WHEN score IS NOT NULL THEN score ELSE 0,尝试删除第一段代码上的IS NOT NULL和ELSE 0,这应该与您的代码正确地映射列。但是尝试先查看我的更新并测试运行。

更新:

这是你的代码,我稍微修改了一下:

代码语言:javascript
复制
SET @mysql = NULL;

SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
                 'max(case when competency = ''',
      competency,
      ''' and competency is not null then score else 0 end) AS `',
      competency,
      '`'
            )
) INTO @mysql
FROM (SELECT competency, scoring_self.score FROM competency LEFT JOIN
scoring_self ON competency.competency_ID = scoring_self.competency_ID
ORDER BY competency) AS sub;


SET @mysql2= CONCAT('SELECT DISTINCT(DATE(ss.date_evaluated)) AS `Date
Evaluated`, ' , @mysql, 
'FROM competency c INNER JOIN scoring_self ss
ON c.competency_ID = ss.competency_ID
GROUP BY ss.date_evaluated;');
PREPARE stmt FROM @mysql2;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49063853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档