2012-10-23 78 views
0

可能重複:
Select MYSQL rows but rows into columns and column into rows如何動態地把行轉換成列,反之亦然

如何顯示來自:

╔══════╦════╦════╗ 
║ Code ║ A ║ B ║ 
╠══════╬════╬════╣ 
║ xxxx ║ 50 ║ 63 ║ 
║ yyyy ║ 38 ║ 68 ║ 
║ .... ║ .. ║ .. ║ 
╚══════╩════╩════╝ 

喜歡這個:

╔══════╦══════╦══════╦═════╗ 
║ Code ║ xxxx ║ yyyy ║ ... ║ 
╠══════╬══════╬══════╬═════╣ 
║ A ║ 50 ║ 63 ║ ... ║ 
║ B ║ 38 ║ 68 ║ ... ║ 
╚══════╩══════╩══════╩═════╝ 

因爲它可能有幾個「代碼」像xxxx,yyyy,zzzz,...
所以,我需要動態顯示所有的「代碼」沒有硬編碼。

+0

沒有標準的方法來動態實現這一目標只是使用常規的SQL –

+0

順便說一句,我需要得到頭不硬編碼。那可能嗎? – Jimmy428

+0

查看這些鏈接 - [動態數據透視表(將行轉換爲列)](http://buysql.com/mysql/14-how-to-automate-pivot-tables.html),[自動化數據透視表查詢](http://www.artfulsoftware.com/infotree/queries.php#523)。 – Devart

回答

1

不幸的是,MySQL不具有UNPIVOTPIVOT功能,但它們可以使用UNION ALLUNPIVOTCASE聲明爲PIVOT聚合函數被複制。如果你知道你想要轉換的值,那麼你可以硬編碼則類似於以下內容:

select col code, 
    sum(case when code = 'xxxx' then value end) xxxx, 
    sum(case when code = 'xxxx' then value end) yyyy 
from 
(
    select code, A value, 'A' col 
    from table1 
    union all 
    select code, B value, 'B' col 
    from table1 
) x 
group by col; 

SQL Fiddle with Demo

但你說,你將有數目不詳的code值。如果是這樣的話,那麼你可以使用準備好的語句pivot數據:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'SUM(case when code = ''', 
     code, 
     ''' then value end) AS ', 
     code 
    ) 
) INTO @sql 
FROM Table1; 

SET @sql = CONCAT('SELECT col as code, ', @sql, ' 
        FROM 
        (
        select code, A value, ''A'' col 
        from table1 
        union all 
        select code, B value, ''B'' col 
        from table1 
       ) x 
        GROUP BY col'); 

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

SQL Fiddle with Demo

都產生相同的結果:

| CODE | XXXX | YYYY | 
---------------------- 
| A | 50 | 38 | 
| B | 63 | 68 | 
+0

如果這個問題在「toad for oracle」(plsql)中怎麼樣。它的解決方案是什麼?非常感謝任何人的幫助。 – Jimmy428

+0

@ Jimmy428什麼版本的Oracle?答案根據版本不同而不同。 – Taryn

相關問題