我正在尝试创建一个嵌套结构;

id | degerAdi    | deger
_____________________________
1  | asd         | 1
2  | asd         | 2
3  | asd         | 345
4  | rty         | 6765
5  | rty         | ljkl
6  | hhh         | 567
7  | hjh         | 5674
8  | ffgu        | 567
9  | qwe         | 345345
10 | qwe         | fghfghfh
11 | qwe         | ghghjghjgj


我需要一种方法来获取结果,例如以'degerAdi'colmn的值作为colmn名称,以及以'deger'colmn的相关值作为这些colm的值(行)。

(对不起,我的英语水平差。)
我需要这样的结果;

asd    | rty   | hhh  | hjh  | ffgu | qwe
-----------------------------------------------------
1      | 6765  | 567  | 5674 | 567  | 345345
2      | 6765  | NULL | NULL | NULL | fghfghfh
345    | NULL  | NULL | NULL | NULL | ghghjghjgj

最佳答案

您正在尝试PIVOT数据,但是MySQL没有PIVOT函数。另外,为了简化操作,您将希望基于degerAdi值对数据进行分区以应用行号。如果您知道已知的列数,则可以使用:

select rn,
  max(case when DEGERADI = 'asd' then DEGER end) asd,
  max(case when DEGERADI = 'rty' then DEGER end) rty,
  max(case when DEGERADI = 'hhh' then DEGER end) hhh,
  max(case when DEGERADI = 'hjh' then DEGER end) hjh,
  max(case when DEGERADI = 'ffgu' then DEGER end) ffgu,
  max(case when DEGERADI = 'qwe' then DEGER end) qwe
from
(
  select id, degerAdi, deger,
   @num := if(@degerAdi = `degerAdi`, @num + 1, 1) as rn,
   @degerAdi := `degerAdi` as dummy
  from table1
) x
group by rn;


SQL Fiddle With Demo

如果列数未知,则需要使用准备好的语句:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when degerAdi = ''',
      degerAdi,
      ''' then deger end) AS ',
      degerAdi
    )
  ) INTO @sql
FROM Table1;

SET @sql
  = CONCAT('SELECT rn, ', @sql, '
           from
           (
             select id, degerAdi, deger,
              @num := if(@degerAdi = `degerAdi`, @num + 1, 1) as rn,
              @degerAdi := `degerAdi` as dummy
             from table1
           ) x
           group by rn');

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


SQL Fiddle with demo

关于mysql - 我需要一种在MySQL中将列值用作列名的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12730070/

10-11 03:00
查看更多