-1

我有这张桌子。

+------+-------+--------+
| CODE | MONTH | AMOUNT |
+------+-------+--------+
|    2 |     1 |    100 |
|    3 |     1 |    200 |
|    2 |     2 |    300 |
|    3 |     2 |    400 |
+------+-------+--------+

而且,这就是我想要得到的结果。

+------+---------+---------+
| CODE |     MO1 |     MO2 |
+------+---------+---------+
|    2 |     100 |     300 |
|    3 |     200 |     400 |
+------+---------+---------+

我知道在 select 内循环是不可能的。
我想我也许可以使用CASE,但我没有像上面的示例中那样明确的月份数,其中只有 1 月和 2 月的数据。稍后我会有 3 月份的数据。我怎样才能做到这一点?

4

2 回答 2

5

由于您不知道确切的月数,您可以像这样动态地进行操作:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(case when Month = ''',
      Month,
      ''' then Amount else 0 end) AS `Mo',
      Month, '`'
    )
  ) INTO @sql
FROM Table2;


SET @sql = CONCAT('SELECT Code, ', @sql, '
                  FROM Table2 
                  GROUP BY Code');

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

结果:

| CODE | MO1 | MO2 |
--------------------
|    2 | 100 | 300 |
|    3 | 200 | 400 |

看到这个 SQLFiddle

于 2013-04-19T06:56:00.110 回答
0
SELECT A.CODE AS CODE, A.AMOUNT as MO1, B.AMOUNT as MO2 FROM
((SELECT CODE, AMOUNT from Table1 WHERE MONTH=1) AS A
INNER JOIN
(SELECT CODE, AMOUNT from Table1 WHERE MONTH=2) AS B
ON
A.CODE=B.CODE)

如果超过 2 个月,则添加更多内连接

希望这可以帮助 :)

于 2013-04-19T07:05:15.427 回答