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 動的 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 に答える