2012-09-26 22 views
2

您好我有數據庫,如下所示:組數據基於一個塔

id | service | player | name |   value    
--------+---------+--------+--------+---------------------------- 
104169 | 1232 | 313619 | age | 30   
104171 | 1232 | 313619 | email | [email protected] 
104170 | 1232 | 313619 | gender | 0 
104172 | 1232 | 313620 | age | 21 
104174 | 1232 | 313620 | email | [email protected] 
104173 | 1232 | 313620 | gender | 1 
104175 | 1232 | 313621 | age | 20 
104177 | 1232 | 313621 | email | [email protected] 
104176 | 1232 | 313621 | gender | 1 
104178 | 1232 | 313622 | age | 20 
104180 | 1232 | 313622 | email | [email protected] 
104179 | 1232 | 313622 | gender | 1 
104181 | 1232 | 313625 | age | 20 
104183 | 1232 | 313625 | email | [email protected] 
104182 | 1232 | 313625 | gender | 1 

我需要的球員分組輸出如下:

player | age | gender | email    
--------+-------+---------+------------------ 
313619 | 30 | 0  | [email protected] 
313620 | 21 | 1  | [email protected] 
313621 | 20 | 1  | [email protected] 
313622 | 20 | 1  | [email protected] 
313625 | 20 | 1  | [email protected] 

什麼想法?

+2

別t下次使用'
'代碼標籤。編輯器上還有一個_code_按鈕。 http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks –

+2

您使用的是什麼dbms(MySQL,Oracle,MS Sql-Server,...)? –

回答

3

試試這個:

SELECT 
    player, 
    MAX(CASE WHEN name = 'email' THEN value END) AS email, 
    MAX(CASE WHEN name = 'gender' THEN value END) AS gender, 
    MAX(CASE WHEN name = 'age' THEN value END) AS age 
    FROM table 
    GROUP BY player 
1

你有什麼有一個爛攤子。我會建議你重新考慮你的數據庫設計。出於某種原因,字段具有數據類型。

如果你的數據庫支持PIVOT你可以做到這一點...

select player, age,gender, email from 
(select player, name, value from yourtable) src 
pivot 
(max(value) for name in ([age],[email],[gender])) p 
0

你不指定RDBMS,但你有幾種方法可以做到這一點。如果你,那麼你可以硬編碼使用已知的列數或者:

如果
SELECT player, 
    MAX(CASE WHEN name = 'email' THEN value END) AS email, 
    MAX(CASE WHEN name = 'gender' THEN value END) AS gender, 
    MAX(CASE WHEN name = 'age' THEN value END) AS age 
FROM yourtable 
GROUP BY player 

MySQL Fiddle with Demo或者你的RDBMS有PIVOT函數,那麼:

select * 
from 
(
    select player, name, value 
    from yourtable 
) x 
pivot 
(
    max(value) 
    for name in ([age], [gender], [email]) 
) p; 

SQL Server PIVOT Fiddle Demo

但如果你有數目不詳的MySQL中的列,您可以使用準備好的語句:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(CASE WHEN name = ''', 
     name, 
     ''' then value else null end) AS ', 
     name 
    ) 
) INTO @sql 
FROM Yourtable; 

SET @sql = CONCAT('SELECT player, ', @sql, ' 
        FROM yourtable 
        GROUP BY player'); 

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

MySQL prepared statement Fiddle Demo或SQL-服務器動態SQL:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT player, ' + @cols + ' from 
      (
       select player, name, value 
       from yourtable 
      ) x 
      pivot 
      (
       max(value) 
       for name in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Server Dynamic Fiddle with Demo