mysql - 使用动态 SQL 将行转换为列

标签 mysql sql dynamic

我正在使用 MySQL Server Management Studio,有 3 个表:Person、ClientDiagnosis 和 Diagnosis。这些表中的行包含我希望显示为列的数据。我在这里发现了类似的问题,并且有一个似乎很接近的答案:建议使用动态 sql,因为列数会根据行而变化。

这就是我所拥有的(请原谅格式,因为我没有看到表格的 Markdown 。如果有人可以告诉我如何修复它,我很乐意修复它):

<小时/>

人员 ID |AXIS_NUM|DIAGNOSIS_NAME

1 | 1 |抑郁症

1 | 1 |饮食失调

2 | 1 |精神病

3 | 2 |饮食失调

1 | 1 |精神病

2 | 1 |药物诱发的精神病

我希望它看起来像这样:

人员 ID |AXIS_NUM 1 (I)| AXIS_NUM 1 (II)|AXIS_NUM 1 (III)|AXIS_NUM 2 (I)|

1 |抑郁症|饮食失调|精神病|空

2 |精神病|药物诱发的精神病|空|空

3|空|空|空||饮食失调

这是我正在使用的代码:

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(CASE WHEN AxisNum = ''',
      AxisNum,
      ''' THEN d.DiagnosisID END) AS `',
      AxisNum, '`'
    )
  ) INTO @sql
FROM ClientDiagnosis;


SET @sql 
  = CONCAT('SELECT p.personid ', @sql, ' 
           from Person p
           left join ClientDiagnosis cd
             on p.Personid = cd.pdid
           left join Diagnosis d
             on cd.DiagnosisID=d.diagnosisid
           group by p.Personid');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

我对动态 sql 很陌生,无法调试它,所以任何帮助将不胜感激。谢谢。

最佳答案

您正在尝试“旋转”。我有一个存储过程可以为您完成大部分工作。请参阅http://mysql.rjweb.org/doc.php/pivot

关于mysql - 使用动态 SQL 将行转换为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28652833/

相关文章:

c++ - 用于存储地址的一列列表的数据结构,在 C++ 中更好地查找 O(1)

java - 如何正确处理 Java/JDBC 中的 InnoDB 死锁?

mysql - PDO异常 : SQLSTATE[42000]

PHP 使用 FetchAll 创建函数

SQL REPLACE 函数,如何替换单个字母

php - php中的简单注册页面

javascript - 如何在React Native 'Share'函数中设置动态url

mysql - 如何使用另一个数据库中的条件从一个数据库中进行选择

java - 如何对 SQL 查询进行单元测试?

python - 如何在 Python 中调试动态定义的函数?