2012-10-17 56 views
0

可能重複:
mysql converting multiple rows into columns in a single row的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 

我找遍了那裏,這可能嗎?我只需要一些指導。

回答

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 with Demo

靜態版本將與此類似:

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 with Demo

+0

非常感謝您的大力幫助。 – Vahid

+0

爲什麼我得到#1243 - 未知的預處理語句處理程序(stmt)在本地主機phpmyadmin中運行動態方式時給予EXECUTE?有人在這裏說:http://stackoverflow.com/questions/12270953/combine-multiple-rows-into-one-mysql,但我不明白他做了什麼。 – Vahid

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; 

我認爲應該這樣做。

+0

感謝,但as_c2和as_c3爲空! – Vahid

+0

@Vahid你可以把樣本數據放到sqlfiddle嗎? – hjpotter92