2

您好我有如下数据库:

   id   | service | player |  name  |           value            
--------+---------+--------+--------+----------------------------
 104169 |    1232 | 313619 | age    | 30         
 104171 |    1232 | 313619 | email  | something@gmail.com
 104170 |    1232 | 313619 | gender | 0
 104172 |    1232 | 313620 | age    | 21
 104174 |    1232 | 313620 | email  | example@zoznam.sk
 104173 |    1232 | 313620 | gender | 1
 104175 |    1232 | 313621 | age    | 20
 104177 |    1232 | 313621 | email  | nothing@gmail.com
 104176 |    1232 | 313621 | gender | 1
 104178 |    1232 | 313622 | age    | 20
 104180 |    1232 | 313622 | email  | forth_mail@gmail.com
 104179 |    1232 | 313622 | gender | 1
 104181 |    1232 | 313625 | age    | 20
 104183 |    1232 | 313625 | email  | lastmail@citromail.hu
 104182 |    1232 | 313625 | gender | 1

我需要按玩家分组的输出如下:

 player |  age  |  gender | email            
--------+-------+---------+------------------
 313619 | 30    | 0       | something@gmail.com
 313620 | 21    | 1       | example@zoznam.sk
 313621 | 20    | 1       | nothing@gmail.com
 313622 | 20    | 1       | forth_mail@gmail.com
 313625 | 20    | 1       | lastmail@citromail.hu

任何的想法?

4

3 回答 3

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
于 2012-09-26T12:39:05.647 回答
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
于 2012-09-26T12:49:03.473 回答
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 小提琴演示

但是如果你在 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 准备语句 Fiddle Demo或 SQL-Server Dynamic 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 动态小提琴与演示

于 2012-09-26T12:52:56.807 回答