如何使用 GROUP_CONCAT 动态转换和生成串联的列名称

How to use GROUP_CONCAT to pivot and generate concatenated column names dynamically

我有一个 table 化合物在感染不同病毒的不同细胞系中具有抗病毒活性,像这样:

ID  Batch_ID    Cell_Line   Virus   Conc    Effect
1   abc123      U87         ZIKV    5       67
2   abc123      SW13        HAZV    10      35
3   def456      U87         ZIKV    5       85
4   def456      SW13        HAZV    10      15

我想将其转换为如下所示的视图:

ID  Batch_ID    U87_ZIKV_5  SW13_HAZV_10
1   abc123      67          35
2   def456      85          15

所以基本上是一个枢轴,它通过动态连接 Cell_Line、Virus 和 Conc 的原始行值来生成新列和相应的名称,然后报告每个化合物的影响。对于有限数量的组合,这当然可以是 'hard-coded',但我想允许以后添加其他细胞系、病毒株和浓度的可能性,因此动态生成旋转列名称.

感谢您提供有关如何在 mySQL 中有效编码的任何指示!

因此,table 的硬编码解决方案非常简单:

select Batch_ID,
  SUM(CASE WHEN CONCAT(Cell_Line,'_',Virus,'_',CONVERT(Conc,CHAR))= 'U87_ZIKV_5' THEN Effect END) U87_ZIKV_5,
  SUM(CASE WHEN CONCAT(Cell_Line,'_',Virus,'_',CONVERT(Conc,CHAR)) = 'SW13_HAZV_10' THEN Effect END) SW13_HAZV_10
from viruses
group by Batch_ID;

但是如果你想让它变得灵活,你应该使用称为动态枢轴 tables 的东西。我使用了 here 讨论的方法并想出了这个 MySQL 应该可以解决您的问题的代码:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(CASE WHEN CONCAT(Cell_Line,\'_\',Virus,\'_\',CONVERT(Conc,CHAR)) =  ''',
      CONCAT(Cell_Line,'_',Virus,'_',CONVERT(Conc,CHAR)),
      ''' THEN Effect END) AS ',
      CONCAT(Cell_Line,'_',Virus,'_',CONVERT(Conc,CHAR))
    )
  ) INTO @sql
from viruses;

SET @sql = CONCAT('SELECT Batch_ID, ', @sql, ' from viruses
group by Batch_ID');

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