[英]Dynamic Crosstab Query in MySQL
I have a problem when switching from SQL Server to MySQL with Crosstab Query. 使用交叉表查询从SQL Server切换到MySQL时遇到问题。
Suppose that I have a table like this: 假设我有一个这样的表:
| 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 |
I would like to display it like this: 我想这样显示:
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
How can I create this kind of crosstab in MySQL? 如何在MySQL中创建这种交叉表?
You can test data at here : http://sqlfiddle.com/#!9/9cf88/1 您可以在此处测试数据: http : //sqlfiddle.com/#!9/9cf88/1
Thank You! 谢谢!
Use Following Query 使用以下查询
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.