2015-08-22 17 views
-2

我需要以下方案的幫助。我們如何動態地將行中的不同值作爲列名獲取?如何獲取行值作爲列名在Mysql中

我有數據如下格式..

Sno firstName Subject Marks 
1  ABC   Eng  10 
2  PQR   Hindi 20 
3  LM   Telgu 20 
4  LM   Hindi 20 
5  LM   Eng  39 

我需要輸出在下面的格式。

Sno FirstName Eng Hindi Telgu 
    1  ABC  10  Null Null 
    2  PQR  Null 20  Null 
    3  LM   39  20  20 

如果增加了一個對象,查詢應寫入足夠的動態,包括太這些價值觀..

如何編寫查詢的呢?

+0

你需要澄清你的問題多一點......你的問題是從這些表中獲取'distinct firstnames'? –

+0

請清除問題,也請嘗試製作表格格式以顯示錶格。未分類的表格數據看起來非常糟糕,不可讀。 –

+0

[MySQL pivot row into dynamic number of columns](http:// stackoverflow。com/questions/12004603/mysql-pivot-row-into-dynamic-number-of-columns)或[包含'mysql dynamic pivot'的帖子](http://stackoverflow.com/search?q=mysql+dynamic+pivot )。 – Abecee

回答

0

你好,因爲阿貝塞告訴你在你的問題的解決方案是擺動表。

這裏查詢你的表

SELECT Sno, firstName, 
     SUM(CASE WHEN Subject = 'Eng' THEN Marks ELSE NULL END) AS Eng, 
     SUM(CASE WHEN Subject = 'Hindi' THEN Marks ELSE NULL END) AS Hindy, 
     SUM(CASE WHEN Subject = 'Telgu' THEN Marks ELSE NULL END) AS Telgu 
FROM t1 
GROUP BY firstName 
ORDER BY Sno 

這裏是SQL Fiddle,看看它是如何工作的?

GL!

編輯:

好吧基於thisbluefeet答案這裏是動態的解決方案爲您的問題

SET @sql = NULL; 
SELECT GROUP_CONCAT(DISTINCT 
     CONCAT('SUM(CASE WHEN Subject = ''', 
       Subject, 
       ''' THEN Marks ELSE NULL END) AS ', 
       REPLACE(Subject, ' ', ''))) INTO @sql 
FROM t1; 

SET @sql = CONCAT('SELECT Sno, firstName, ', @sql, ' 
        FROM t1 
        GROUP BY firstName 
        ORDER BY Sno'); 

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

SET @sql = NULL; 
SELECT GROUP_CONCAT(DISTINCT 
     CONCAT('SUM(CASE WHEN Subject = ''', 
       Subject, 
       ''' THEN Marks ELSE NULL END) AS ', 
       REPLACE(Subject, ' ', ''))) INTO @sql 
FROM t1; 

第一部分是動態的創建這個第一個查詢的一部分,我寫了

SUM(CASE WHEN Subject = 'Eng' THEN Marks ELSE NULL END) AS Eng, 
SUM(CASE WHEN Subject = 'Hindi' THEN Marks ELSE NULL END) AS Hindy, 
SUM(CASE WHEN Subject = 'Telgu' THEN Marks ELSE NULL END) AS Telgu 

第二部分是創建準備好的聲明,並動態創建的部分包括到這個

SELECT Sno, firstName, 
     -- here you add dynamically created part @sql 
FROM t1 
GROUP BY firstName 
ORDER BY Sno 

,隨着代碼

SET @sql = CONCAT('SELECT Sno, firstName, ', @sql, ' 
        FROM t1 
        GROUP BY firstName 
        ORDER BY Sno'); 
當您創建

這部分CONCAT從那個字符串中準備陳述並執行它

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

希望,現在是一點點清晰......

這裏是SQL Fiddle所以你可以看到,你可以比較這兩個查詢,看看它是如何工作..

GL!

P.S.如果您有任何問題請填寫評論以下內容

+0

謝謝但我需要採取行名稱作爲列名稱動態....我不應該分配給朋友名稱... – user3751091

+0

@ user3751091嗨,我編輯我的答案並添加動態生成的查詢。希望有所幫助! –