2012-04-06 35 views
9

Mysql'de nasıl bir pivot tablo yapılacağını biliyorum (bkz. Aşağıdaki kod örneği), pivot tablodaki sütun sayısı çok büyükse ve 2000 veya daha çok tagnames yazmak istemiyorum. ? - Bu listenin oluşturulmasının bir yolu var mı? Çok teşekkürler şimdiden.pivot tablo

drop table pivot; 
create table pivot SELECT time, 
     max(if(tagname = 'a', value, null)) AS 'a', 
     max(if(tagname = 'b', value, null)) AS 'b', 
     max(if(tagname = 'c', value, null)) AS 'c' 
    FROM test where tagname in ('a','b','c') 
GROUP BY time; 
select * from pivot; 
Hep böyle :-) tam

#!/bin/sh 

mysql -BN test > /tmp/$$_tagnames.tmp <<SQL 
select distinct tagname from test; 
SQL 

cat > /tmp/$$_create_table.sql <<EOF 
drop table if exists pivot; 
create table pivot select 
EOF 

while read tag; do 
    echo "max(if(tagname = '$tag', value, null)) AS '$tag'," >> /tmp/$$_create_table.sql 
done < /tmp/$$_tagnames.tmp 

cat >> /tmp/$$_create_table.sql <<EOF 
time 
FROM test 
GROUP BY time; 
select * from pivot; 
EOF 

mysql -Bt test < /tmp/$$_create_table.sql 

rm /tmp/$$_create_table.sql 
rm /tmp/$$_tagnames.tmp 

Veri yapan bir shell script oluşturabilir

+3

göz en Bu makale. http://buysql.com/mysql/14-how-to-automate-pivot-tables.html – GeoGo

cevap

1

:

mysql> select * from test; 
+---------+-------+---------------------+ 
| tagname | value | time    | 
+---------+-------+---------------------+ 
| a  | foo | 2012-12-21 00:00:01 | 
| b  | foo | 2012-04-27 00:00:01 | 
| c  | bar | 2012-03-27 00:00:01 | 
| d  | bar | 2012-12-21 00:00:01 | 
+---------+-------+---------------------+ 
4 rows in set (0.00 sec) 

Senaryo çıkışı:

$ ./pivot.sh 
+------+------+------+------+---------------------+ 
| a | b | c | d | time    | 
+------+------+------+------+---------------------+ 
| NULL | NULL | bar | NULL | 2012-03-27 00:00:01 | 
| NULL | foo | NULL | NULL | 2012-04-27 00:00:01 | 
| foo | NULL | NULL | bar | 2012-12-21 00:00:01 | 
+------+------+------+------+---------------------+ 
+0

Bu akıllıca bir kabuk betiği kullanımıdır ve bu model diğer diller için de kullanılabilir. –