mysql中的列到行交叉表转换

mysql中的列到行交叉表转换,mysql,Mysql,我想在MySQL中创建交叉表 有两个表TABL1和TBL2,我不知道如何将列转换为行 请给我一个解决办法 我的代码如下所示: 从TBL1 t1左键选择*在t1上连接TBL2 t2。des=t2.des TBL1 : DES A C D E TBL2 ID DES 1 A 2 C 3 RESULT THAT I NEED ID A C D E 1 1 2 1 3 关于,试试这个: SELECT t2.id, SUM(IF(t1.des I

我想在MySQL中创建交叉表

有两个表TABL1和TBL2,我不知道如何将列转换为行

请给我一个解决办法

我的代码如下所示:

从TBL1 t1左键选择*在t1上连接TBL2 t2。des=t2.des

TBL1 :
DES
A
C
D
E

TBL2
ID DES
1  A
2  C
3

RESULT THAT I NEED

ID   A   C  D  E
1    1
2        1
3
关于,

试试这个:

SELECT
    t2.id,
    SUM(IF(t1.des IS NOT NULL AND t1.des = 'A',1,0)) as 'A',
    SUM(IF(t1.des IS NOT NULL AND t1.des = 'C',1,0)) as 'C',
    SUM(IF(t1.des IS NOT NULL AND t1.des = 'D',1,0)) as 'D',
    SUM(IF(t1.des IS NOT NULL AND t1.des = 'E',1,0)) as 'E'
FROM
    TBL2 t2
LEFT JOIN TBL1 t1
    ON t2.des = t1.des
GROUP BY
    t2.id

对于某些自动化,您可以尝试使用以下步骤:

  • 制作一个光标来读取TBL1,这样你就知道你有多少个COL了

    DECLARE curs CURSOR FOR SELECT des FROM TBL1;
    
  • 在游标内部,需要为Select语句创建dynamicSQL。像这样的事情:

    ....
    FETCH curs INTO cDes;
    ....
    set @sel = concat(@sel, 
    ', SUM(IF(t1.des IS NOT NULL AND t1.des = ''', cDes,''',1,0)) as ''',cDes, '''');
    ...
    CLOSE curs;
    
    set @crosstab = concat('select t2.id', @sel, 
                            'FROM TBL2 t2
                            LEFT JOIN TBL1 t1 ON t2.des = t1.des
                            GROUP BY t2.id');
    
    PREPARE STMT FROM @crosstab;
    EXECUTE STMT;
    DEALLOCATE PREPARE STMT;
    
  • 完成后,您需要完成dynamicSQL的完整版本。类似这样的:

    ....
    FETCH curs INTO cDes;
    ....
    set @sel = concat(@sel, 
    ', SUM(IF(t1.des IS NOT NULL AND t1.des = ''', cDes,''',1,0)) as ''',cDes, '''');
    ...
    CLOSE curs;
    
    set @crosstab = concat('select t2.id', @sel, 
                            'FROM TBL2 t2
                            LEFT JOIN TBL1 t1 ON t2.des = t1.des
                            GROUP BY t2.id');
    
    PREPARE STMT FROM @crosstab;
    EXECUTE STMT;
    DEALLOCATE PREPARE STMT;
    

  • 这可能会有帮助you@JamDara在mysql中,您无法以动态方式透视数据,您必须手动进行此操作。。。或者更好的方法是从脚本生成查询。我同意@Stephan的观点,我们的oracle数据库也有类似的问题。不能将行值动态转换为字段。