0

可能重复:
mysql将多行转换为单行中的列

我有一个这样的mysql表:

id |  p |  c  |  v
1     p1   10    1
2     p1   20    2
3     p1   30    3
4     p2   40    1
5     p2   50    2
6     p2   60    3

现在我需要运行一个 sql 并得到这样的结果:

p  |  as_c1 | as_c2 | as_c3
p1     10       20      30
p2     40       50      60

我使用了这个查询,但这还不够:

select 
p, 
c as as_c1,
c as as_c2,
c as as_c3
from test_tbl group by p, c

我到处找,这可能吗?我只需要一些指导。

4

2 回答 2

2

这基本上是PIVOT您要执行的操作。不幸的是,MySQL 没有一个PIVOT函数。有两种方法可以静态或动态地执行此操作。如果您知道要转换为列的值,则可以使用静态版本,但如果值未知,则可以使用准备好的语句动态生成:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when v = ''',
      v,
      ''' then c end) AS as_c',
      v
    )
  ) INTO @sql
FROM table1;

SET @sql = CONCAT('SELECT p, ', @sql, ' 
                    FROM table1 
                    GROUP BY p');

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

请参阅带有演示的 SQL Fiddle

静态版本将与此类似:

select p,
  sum(case when v=1 then c end) as_c1,
  sum(case when v=2 then c end) as_c2,
  sum(case when v=3 then c end) as_c3
from table1
group by p

请参阅带有演示的 SQL Fiddle

于 2012-10-17T21:20:28.630 回答
0
SELECT p,
  ( CASE WHEN v = 1 THEN c ELSE NULL END ) AS as_c1,
  ( CASE WHEN v = 2 THEN c ELSE NULL END ) AS as_c2,
  ( CASE WHEN v = 3 THEN c ELSE NULL END ) AS as_c3
FROM `test_tbl`
GROUP BY p;

我认为应该这样做。

于 2012-10-17T20:58:17.300 回答