MySQL中的动态交叉表查询

MySQL中的动态交叉表查询,mysql,database,pivot-table,crosstab,Mysql,Database,Pivot Table,Crosstab,我在使用交叉表查询从SQL Server切换到MySQL时遇到问题 假设我有一张这样的桌子: | ID | BANKID | 1MONTH | 3MONTHS | 6MONTHS | 10MONTHS | 12MONTHS | 18MONTHS | 24MONTHS | 30MONTHS | 36MONTHS | |----|--------|--------|----------------|-------

我在使用交叉表查询从SQL Server切换到MySQL时遇到问题

假设我有一张这样的桌子:

| ID | BANKID | 1MONTH |        3MONTHS |        6MONTHS |       10MONTHS |       12MONTHS | 18MONTHS |       24MONTHS |       30MONTHS |       36MONTHS |
|----|--------|--------|----------------|----------------|----------------|----------------|----------|----------------|----------------|----------------|
|  1 |      1 |      3 | 2.900000095367 | 2.799999952316 | 2.700000047684 | 2.599999904633 |      2.5 | 2.400000095367 | 2.299999952316 | 2.200000047684 |
|  2 |      2 |      5 | 4.900000095367 | 4.800000190735 | 4.699999809265 | 4.599999904633 |      4.5 | 4.400000095367 | 4.300000190735 | 4.199999809265 |
BankID           1          2
1 Month          3          5
3 Months         2.9        4.9
6 Months         2.8        4.8
10 Months        2.7        4.7
12 Months        2.6        4.6
18 Months        2.5        4.5
24 Months        2.4        4.4
30 Months        2.3        4.3
36 Months        2.2        4.2
我想这样展示它:

| ID | BANKID | 1MONTH |        3MONTHS |        6MONTHS |       10MONTHS |       12MONTHS | 18MONTHS |       24MONTHS |       30MONTHS |       36MONTHS |
|----|--------|--------|----------------|----------------|----------------|----------------|----------|----------------|----------------|----------------|
|  1 |      1 |      3 | 2.900000095367 | 2.799999952316 | 2.700000047684 | 2.599999904633 |      2.5 | 2.400000095367 | 2.299999952316 | 2.200000047684 |
|  2 |      2 |      5 | 4.900000095367 | 4.800000190735 | 4.699999809265 | 4.599999904633 |      4.5 | 4.400000095367 | 4.300000190735 | 4.199999809265 |
BankID           1          2
1 Month          3          5
3 Months         2.9        4.9
6 Months         2.8        4.8
10 Months        2.7        4.7
12 Months        2.6        4.6
18 Months        2.5        4.5
24 Months        2.4        4.4
30 Months        2.3        4.3
36 Months        2.2        4.2
如何在MySQL中创建这种交叉表

您可以在此处测试数据:

谢谢大家!

使用以下查询

Set @Sq = NUll;
Set @S =Null;
SET @sql = NULL;

SELECT
    GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(CASE WHEN id = ',
      BankID,' THEN val end) AS "',
      BankID,'"')

    )
into @Sql
FROM
  bankdeposit;


SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'select id, ''',
      c.column_name,
      ''' as Bankid, ',
      c.column_name,
      ' as val 
      from bankdeposit'
    ) SEPARATOR ' UNION ALL '
  ) into @xSq
FROM information_schema.columns c
where c.table_name = 'bankdeposit'
  and c.column_name not in ('id','BankID',
 'CreateDate', 'CreateBy', 'ModifyDate', 'ModifyBy',
 'totalLoan','TotalDeposit','EstablishedYear','NumberOfStore')
order by c.ordinal_position;


SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'select id, ''',
      c.column_name,
      ''' as Bankid, ',
      c.column_name,
      ' as val 
      from bankdeposit'
    ) SEPARATOR ' UNION ALL '
  ) into @S
FROM information_schema.columns c
where c.table_name = 'bankdeposit'
  and c.column_name in ('totalLoan','TotalDeposit',
  'EstablishedYear','NumberOfStore' )
order by c.ordinal_position;


select CONCAT('select Bankid,',@sql,' from(select id, Bankid, val
           from
           (', @xSq,',',@S,') x  order by id) xx group by Bankid 
           order by length(BankID),BankID');

PREPARE stmt FROM @xSq;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Hi Sathish,我将此查询输入到我的真实数据库中,但它不起作用(我的真实数据库中的列比这多)。当联合所有块时会导致错误。上面说“[Err]1054-字段列表中的未知列'id'”。请在这里检查:该表有id列@Pengan@Pengan检查这把小提琴。您在
c中给出了ignore columns name。column\u name不在('id','BankID')
Hi,Sathish,很抱歉再次打扰您。我想显示除“CreateDate”、“CreateBy”、“ModifyDate”、“ModifyBy”之外的所有列,然后我将其放入查询“c.column\u name not in('id','BankID')”。然而,当我输入这个时,它在第1行的“'c.column\u name not in('id','BankID')”附近用正确的语法表示:c.column\u name not in('id','BankID')”。你能帮我修一下吗?非常感谢你的帮助!请点击:@Pengan查看我的查询。现在我要改变它。试着告诉我