0

重複の可能性:
MYSQL 行を選択するが、行を列に、列を行に

からの表示方法:

╔══════╦════╦════╗
║ Code ║ A  ║ B  ║
╠══════╬════╬════╣
║ xxxx ║ 50 ║ 63 ║
║ yyyy ║ 38 ║ 68 ║
║ .... ║ .. ║ .. ║
╚══════╩════╩════╝

これを好きに:

╔══════╦══════╦══════╦═════╗
║ Code ║ xxxx ║ yyyy ║ ... ║
╠══════╬══════╬══════╬═════╣
║ A    ║   50 ║   63 ║ ... ║
║ B    ║   38 ║   68 ║ ... ║
╚══════╩══════╩══════╩═════╝

xxxx、yyyy、zzzzなどの「コード」がいくつか含まれている可能性があるため、
すべての「コード」をハードコーディングせずに動的に表示する必要があります。

4

1 に答える 1

1

UNPIVOT残念ながら、MySQL にはまたは関数はありませんが、forステートメントと集約関数をPIVOT使用して複製できます。変換する値がわかっている場合は、次のようにハードコーディングできます。UNION ALLUNPIVOTCASEPIVOT

select col code,
  sum(case when code = 'xxxx' then value end) xxxx,
  sum(case when code = 'xxxx' then value end) yyyy
from
(
  select code, A value, 'A' col
  from table1
  union all
  select code, B value, 'B' col
  from table1
) x
group by col;

デモで SQL Fiddle を参照してください

しかし、あなたは未知の数のcode値を持つと述べました。その場合はpivot、データに対して準備済みステートメントを使用できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(case when code = ''',
      code,
      ''' then value end) AS ',
      code
    )
  ) INTO @sql
FROM Table1;

SET @sql = CONCAT('SELECT col as code, ', @sql, ' 
                  FROM
                  (
                    select code, A value, ''A'' col
                    from table1
                    union all
                    select code, B value, ''B'' col
                    from table1
                  ) x
                  GROUP BY col');

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

SQL Fiddle with Demoを参照してください。

どちらも同じ結果になります。

| CODE | XXXX | YYYY |
----------------------
|    A |   50 |   38 |
|    B |   63 |   68 |
于 2012-10-23T11:19:13.377 に答える