2012-09-26 4 views
2

salut je base de données comme suit:données de groupe basé sur une colonne

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 

Je besoin d'une sortie groupée par le joueur comme suit:

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] 

une idée?

+2

Don » t utiliser '
' mais les balises de code la prochaine fois. Il y a aussi un bouton _code_ sur le dessus de l'éditeur. http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks –

+2

Quels sont les dbms que vous utilisez (MySQL, Oracle, MS Sql-Server, ...)? –

Répondre

3

Essayez ceci:

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

Qu'est-ce que vous avez il y a un gâchis. Je suggérerais de repenser de toute urgence la conception de votre base de données. Les champs ont des types de données pour une raison.

Si votre base de données prend en charge PIVOT vous pouvez le faire ...

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

Vous ne spécifiez pas le SGBDR, mais vous, il y a plusieurs façons de le faire. Si vous connaissez le nombre de colonnes que vous pouvez coder en dur utilisant:

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 Ou si votre SGBDR a une fonction PIVOT alors:

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

SQL Server PIVOT Fiddle Demo.

Mais si vous avez un nombre inconnu de colonnes MySQL, vous pouvez utiliser les commandes préparées:

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 ou dans SQL-Serveur SQL dynamique:

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

Questions connexes