【问题标题】:Selecting/casting output as integer in SQL在 SQL 中选择/转换输出为整数
【发布时间】:2012-02-12 08:00:36
【问题描述】:

我正在开发一个网站,该网站要求我显示每天用户输入的平均数量的图表。我已经有一个 SQL 查询将这个信息返回给我:

SELECT sum(number)/count(number) as average, date FROM stats WHERE * GROUP BY date

这给了我我正在寻找的结果,但结果以小数点后三位的精度给出。我想把这个数字四舍五入。当然,我可以在 PHP 或我的模板引擎中完成,但我很好奇是否有办法在数据库中完成这一切。

有没有办法将输出转换为整数(在 MySQL 中)?

【问题讨论】:

  • 出于好奇,您有什么理由不使用AVG function
  • @jimmy_keen 不知道它的存在!有理由使用它吗? (更好、更快、更强?)
  • @MrGlass - 更简洁,避免其他 RDBMS 中可能出现的除零问题(AFAIK MySQL 在除以零时返回 NULL

标签: mysql sql int


【解决方案1】:
SELECT 
  CAST(sum(number)/count(number) as UNSIGNED) as average, 
  date 
FROM stats 
WHERE * 
GROUP BY date

【讨论】:

  • -1。如果你使用“INT”作为类型,你会得到一个错误。 CAST/CONVERT 的可用类型可以在文档dev.mysql.com/doc/refman/5.0/en/… 中看到
  • 重要吗?该方法正在回答问题。
  • @alex 在 MySQL 5.5(某些存储库上的最新版本)上将导致 1064 错误。它可能适用于一些较新的版本,尽管它似乎没有记录
【解决方案2】:

CAST 在 MySQL 中的有效类型如下

  • BINARY[(N)]
  • CHAR[(N)]
  • DATE
  • DATETIME
  • DECIMAL[(M[,D])]
  • SIGNED [INTEGER]
  • TIME
  • UNSIGNED [INTEGER]

所以你可以使用

SELECT CAST(sum(number)/count(number) AS UNSIGNED) as average...

SIGNED,如果SUM 部分可以加起来为负数。

【讨论】:

    【解决方案3】:

    使用DIV operator

    mysql> SELECT 5 DIV 2;
        -> 2
    

    整数除法。类似于 FLOOR(),但使用 BIGINT 值是安全的。超出 BIGINT 范围的非整数操作数可能会出现不正确的结果。

    【讨论】:

      【解决方案4】:

      用MySQLFORMAT函数怎么样?

      mysql> SELECT FORMAT(12345.123456, 4);
      +-------------------------+
      | FORMAT(12345.123456, 4) |
      +-------------------------+
      | 12,345.1235             |
      +-------------------------+
      1 row in set (0.00 sec)
      
      mysql> SELECT FORMAT(12345.123456, 0);
      +-------------------------+
      | FORMAT(12345.123456, 0) |
      +-------------------------+
      | 12,345                  |
      +-------------------------+
      1 row in set (0.00 sec)
      

      【讨论】:

        【解决方案5】:
        SELECT convert(int, sum(number)/count(number)) as average,
          date
        FROM stats
        WHERE * GROUP BY date
        

        SELECT 
          CAST(sum(number)/count(number) as INT) as average, 
          date 
        FROM stats 
        WHERE * 
        GROUP BY date
        

        【讨论】:

          【解决方案6】:
          1. 用户mysql函数round()
          2. 示例 round(23.33) 将在 msyql 中返回 23。

          您的示例查询将更新为

          SELECT round(sum(number)/count(number)) as average, date FROM stats WHERE * GROUP BY date
          

          【讨论】:

            猜你喜欢
            • 2014-05-06
            • 1970-01-01
            • 2011-02-14
            • 1970-01-01
            • 2012-07-13
            • 1970-01-01
            • 2019-09-12
            • 2018-06-29
            • 2018-03-11
            相关资源
            最近更新 更多