mysql选择动态行作为列名

mysql选择动态行作为列名,mysql,rows,dynamic-columns,Mysql,Rows,Dynamic Columns,我正在尝试以这种格式创建一个表。我如何才能做到这一点 Student_id | Skill_id | skill-Score 1 30 5 1 50 1 1 63 2 1 42 2 2 30 7 2 50 3

我正在尝试以这种格式创建一个表。我如何才能做到这一点

Student_id | Skill_id  | skill-Score
1              30            5
1              50            1
1              63            2
1              42            2

2              30            7
2              50            3
2              63            6
2              42            9
这是我试过的,但没有结果,请不要考虑我的尝试。< /P>
Student_id ||    30   ||     50   ||     63   ||    42   |
    1             5          1           2           2
    2             7          3           6           9

如果技能ID的数量已知且固定,则可以使用简单的透视查询:

SELECT CONCAT(
  'SELECT `r_job_scores`.id_score', GROUP_CONCAT('
     ,    `t_', REPLACE(skill_id, '`', '``'), '`.value
         AS `', REPLACE(skill_id, '`', '``'), '`'
     SEPARATOR ''),
 ' FROM `r_job_scores` ', GROUP_CONCAT('
     LEFT JOIN `r_job_scores`   AS `t_', REPLACE(skill_id, '`', '``'), '`
            ON `r_job_scores`.id_score = `t_', REPLACE(skill_id, '`', '``'), '`.id_score
           AND `t_', REPLACE(skill_id, '`', '``'), '`.skill_id = ', QUOTE(skill_id)
     SEPARATOR ''),
 ' GROUP BY `r_job_scores`.id_score'
)
如果你想得到学生的总分数,一种方法是对我上面给出的查询进行子查询,然后计算出分数:

SELECT Student_Id,
       MAX(CASE WHEN Skill_id = 30 THEN skill-Score END) AS `30`,
       MAX(CASE WHEN Skill_id = 50 THEN skill-Score END) AS `50`,
       MAX(CASE WHEN Skill_id = 63 THEN skill-Score END) AS `63`,
       MAX(CASE WHEN Skill_id = 42 THEN skill-Score END) AS `42`
FROM r_job_scores
GROUP BY Student_Id

如果技能ID的数量已知且固定,则可以使用简单的透视查询:

SELECT CONCAT(
  'SELECT `r_job_scores`.id_score', GROUP_CONCAT('
     ,    `t_', REPLACE(skill_id, '`', '``'), '`.value
         AS `', REPLACE(skill_id, '`', '``'), '`'
     SEPARATOR ''),
 ' FROM `r_job_scores` ', GROUP_CONCAT('
     LEFT JOIN `r_job_scores`   AS `t_', REPLACE(skill_id, '`', '``'), '`
            ON `r_job_scores`.id_score = `t_', REPLACE(skill_id, '`', '``'), '`.id_score
           AND `t_', REPLACE(skill_id, '`', '``'), '`.skill_id = ', QUOTE(skill_id)
     SEPARATOR ''),
 ' GROUP BY `r_job_scores`.id_score'
)
如果你想得到学生的总分数,一种方法是对我上面给出的查询进行子查询,然后计算出分数:

SELECT Student_Id,
       MAX(CASE WHEN Skill_id = 30 THEN skill-Score END) AS `30`,
       MAX(CASE WHEN Skill_id = 50 THEN skill-Score END) AS `50`,
       MAX(CASE WHEN Skill_id = 63 THEN skill-Score END) AS `63`,
       MAX(CASE WHEN Skill_id = 42 THEN skill-Score END) AS `42`
FROM r_job_scores
GROUP BY Student_Id

您可以使用动态sql实现这一点

查询

SELECT t.Student_Id,
       t.`30` + t.`50` + t.`63` + t.`42` AS overall_score
FROM
(
    SELECT Student_Id,
           MAX(CASE WHEN Skill_id = 30 THEN skill-Score END) AS `30`,
           MAX(CASE WHEN Skill_id = 50 THEN skill-Score END) AS `50`,
           MAX(CASE WHEN Skill_id = 63 THEN skill-Score END) AS `63`,
           MAX(CASE WHEN Skill_id = 42 THEN skill-Score END) AS `42`
    FROM r_job_scores
    GROUP BY Student_Id
) t
输出

set @query = null;
select
  group_concat(distinct
    concat(
      'max(case when `Skill_id` = ',
      `Skill_id`, ' then `skill-Score` end) as `', `Skill_id` , '`'
    )
  ) into @query
from `your_table_name`;

set @query = concat('select `Student_id`, ', @query, ' from `your_table_name` 
              group by `Student_id`
');

prepare stmt from @query;
execute stmt;
deallocate prepare stmt;

您可以使用动态sql实现这一点

查询

SELECT t.Student_Id,
       t.`30` + t.`50` + t.`63` + t.`42` AS overall_score
FROM
(
    SELECT Student_Id,
           MAX(CASE WHEN Skill_id = 30 THEN skill-Score END) AS `30`,
           MAX(CASE WHEN Skill_id = 50 THEN skill-Score END) AS `50`,
           MAX(CASE WHEN Skill_id = 63 THEN skill-Score END) AS `63`,
           MAX(CASE WHEN Skill_id = 42 THEN skill-Score END) AS `42`
    FROM r_job_scores
    GROUP BY Student_Id
) t
输出

set @query = null;
select
  group_concat(distinct
    concat(
      'max(case when `Skill_id` = ',
      `Skill_id`, ' then `skill-Score` end) as `', `Skill_id` , '`'
    )
  ) into @query
from `your_table_name`;

set @query = concat('select `Student_id`, ', @query, ' from `your_table_name` 
              group by `Student_id`
');

prepare stmt from @query;
execute stmt;
deallocate prepare stmt;

如果您需要php/html格式的输出(它以前被标记为php…),您只需要
按学生id、技能id从r_作业中选择*即可根据需要构建表。如果您需要php/html格式的输出(它以前被标记为php…),您只需要
按学生id从r_作业中选择*即可,Skill_id
能够根据需要构建表格。谢谢。。我有一个疑问,我想把学生技能的总和作为学生1(5+1+2+2)的总分。我该怎么做呢?谢谢。。我有一个疑问,我想把学生技能的总和作为整体分数来计算。
个人技能的总和。学生1(5+1+2+2)作为整体分数。我该怎么做?一个是dbfiddle.uk:)如果列
Skill\u id
的值是字符串怎么办?一个是dbfiddle.uk:)如果列
Skill\u id
的值是字符串怎么办?