【问题标题】:How to somehow do a loop within select?如何以某种方式在选择中进行循环?
【发布时间】:2013-04-19 06:50:48
【问题描述】:

我有这张桌子。

+------+-------+--------+
| 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,但我没有明确的月份数 就像我上面的例子一样,其中只有一月份的数据 和二月。稍后我会有 3 月份的数据。我该怎么做?

【问题讨论】:

  • 看看pivot函数。
  • @AndriusNaruševičius mysql 没有数据透视函数。
  • 是否有最长 12 个月或月数真的未知?
  • 简单来说,有点像月度盘点。

标签: mysql sql pivot


【解决方案1】:

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

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 |

See this SQLFiddle

【讨论】:

  • 谢谢。我想知道这三个单引号是什么意思。 Phpmyadmin 在 'SELECT GROUP_CONCAT(DISTINCT CONCAT( 'SUM(case when Month = ''', '.) 附近返回语法错误
  • @esandrkwn - 现在查看更新后的答案。那是varchar 数据类型,而这里的月份不是varchar。所以删除它。
  • 非常感谢,非常感谢。我不确定发生了什么,但是在创建同一个表 Table2 之后,我完全从小提琴中复制了代码。当分隔符设置为';;'或者没有分隔符,我得到与上面相同的错误。当我将其设置为';'我收到此错误:'#1243 - 给 EXECUTE 的未知预准备语句处理程序 (stmt)'。有什么想法吗?
  • @esandrkwn - 同样的问题是here。您需要使用单独的查询来完成。一个构建stmt,一个执行它。 See the comment of the OP here
  • @esandrkwn - 成功后请告诉我。
【解决方案2】:
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 个月,则添加更多内部联接

希望这会有所帮助:)

【讨论】:

  • OP 已经告诉他不知道确切的月数。所以这对他没有帮助。
  • 假设月数不超过 12,这个 sql 仍然有效。但是,你的 sql 似乎更聪明:)
猜你喜欢
  • 2014-04-16
  • 2017-07-21
  • 2022-01-26
  • 2015-02-11
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
相关资源
最近更新 更多