3

我想从我的桌子上得到一个特殊的结果,我想知道这是可能的!?我有一个像这样的表: (idA , idB , val) 通过这个值:

国际开发署 | 身份证 | 值
----+-------+----------
1 | 5 | 50
1 | 6 | 0
1 | 7 | 无效的
2 | 5 | 100
2 | 6 | 12
2 | 7 | 0

我想通过这样的格式从这个表中选择:

国际开发署 | 5 | 6 | 7
----+-------+-------+--------
1 | 50 | 0 | 无效的
2 | 100 | 12 | 0

怎么可能?

注意:我进行了一些搜索,但一无所获,如果您知道一个好的关键字,这对我很有用。

4

2 回答 2

4

你可以试试这个查询:

SELECT idA
  ,GROUP_CONCAT(CASE WHEN idB = 5 THEN val ELSE NULL END) AS `5`
  ,GROUP_CONCAT(CASE WHEN idB = 6 THEN val ELSE NULL END) AS `6`
  ,GROUP_CONCAT(CASE WHEN idB = 7 THEN val ELSE NULL END) AS `7`
FROM MyTable
GROUP BY idA

如果您不知道idB您可以使用此动态查询的数量:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'GROUP_CONCAT(CASE WHEN `idB` = ''',
      `idB`,
      ''' THEN val ELSE NULL END) AS `',
      `idB`, '`'
    )
  ) INTO @sql
FROM MyTable;

SET @sql = CONCAT('SELECT idA, ', @sql,'
                     FROM MyTable
                    GROUP BY idA
                  ');

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

输出:

| IDA |   5 |  6 |      7 |
---------------------------
|   1 |  50 |  0 | (null) |
|   2 | 100 | 12 |      0 |

看到这个 SQLFiddle

于 2013-08-12T10:56:13.323 回答
1

你可以试试这个

   select idA ,
     max(CASE WHEN idB = 5 then val end) as '5',
     max(CASE WHEN idB = 6 then val end) as '6',
     max(CASE WHEN idB = 7 then val end) as '7'
     from Table1
   GROUP BY idA

在这里演示

输出:

| IDA |   5 |  6 |      7 |
---------------------------
|   1 |  50 |  0 | (null) |
|   2 | 100 | 12 |      0 |
于 2013-08-12T11:00:15.947 回答