【问题标题】:SQL decimal conversionSQL十进制转换
【发布时间】:2013-03-22 03:42:54
【问题描述】:

我在转换这个十进制值时遇到了一些问题,如下所示:

21.6080402010050

谁能帮我把它转换成21.6

我试过这个,但它不起作用。

(convert(decimal(10, 2), SUM(t1.TOTAL))

这是查询

SELECT 
    t1.LINE_NO, t1.E_FIELD, t1.F_FIELD, t1.G_FIELD, t1.HSA_STATUS, 
    t1.FAMILY, t1.CACHE_FAMILY, 
    SUM(t1.TOTAL) AS CountOfLineNo, t2.TotalOfLineNo, 
    (convert(decimal(8,1), SUM(t1.TOTAL)) * 100 / t2.TotalOfLineNo ) AS Percentage
FROM (
    SELECT 
        LINE_NO, E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY, 
        Count(LINE_NO) as Total
    FROM TX_HSA_SUMM
    WHERE MT_TIMESTAMP2 BETWEEN ('2013-03-07 10:10:00') AND ('2013-03-08 10:20:00')
    GROUP BY LINE_NO, E_FIELD, F_FIELD, G_FIELD, HSA_STATUS, FAMILY, CACHE_FAMILY) AS t1 
LEFT JOIN (
      SELECT LINE_NO, COUNT(LINE_NO) AS TotalOfLineNo
      FROM TX_HSA_SUMM
      WHERE MT_TIMESTAMP2 BETWEEN ('2013-03-07 10:10:00') AND ('2013-03-08 10:20:00')
      GROUP BY LINE_NO) AS t2 ON t1.LINE_NO = t2.LINE_NO
GROUP BY 
   t1.LINE_NO, t1.E_FIELD, t1.F_FIELD, t1.G_FIELD, t1.HSA_STATUS, t1.FAMILY, 
   t1.CACHE_FAMILY, t1.Total, t2.TotalOfLineNo
ORDER BY 
   t1.LINE_NO, t1.E_FIELD, t1.F_FIELD, t1.G_FIELD, t1.HSA_STATUS, t1.FAMILY, 
   t1.CACHE_FAMILY, t1.Total, t2.TotalOfLineNo

输出是

LINE_NO E_FIELD F_FIELD G_FIELD HSA_STATUS FAMILY CACHE_FAMILY CountOfLineNo    TotalOfLineNo   Percentage
23053B  00000   00000   00000   S   SUMMIT  WER 43  199 21.608040201005%

【问题讨论】:

  • 你用的是什么数据库引擎?

标签: sql sql-server decimal


【解决方案1】:

请尝试以下查询

SELECT t1.LINE_NO, t1.E_FIELD, t1.F_FIELD, t1.G_FIELD, t1.HSA_STATUS, t1.FAMILY, t1.CACHE_FAMILY, 
    SUM(t1.TOTAL) AS CountOfLineNo, t2.TotalOfLineNo, convert(decimal(18,1),(convert(decimal(8,1),SUM(t1.TOTAL)) * 100 / t2.TotalOfLineNo)) AS Percentage
    FROM (
          SELECT LINE_NO, E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY, Count(LINE_NO) as Total
          FROM TX_HSA_SUMM
          WHERE MT_TIMESTAMP2 BETWEEN ('2013-03-07 10:10:00') AND ('2013-03-08 10:20:00')
          GROUP BY LINE_NO,E_FIELD,F_FIELD,G_FIELD,HSA_STATUS,FAMILY,CACHE_FAMILY
        ) AS t1 
    LEFT JOIN (
          SELECT LINE_NO, COUNT(LINE_NO) AS TotalOfLineNo
          FROM TX_HSA_SUMM
          WHERE MT_TIMESTAMP2 BETWEEN ('2013-03-07 10:10:00') AND ('2013-03-08 10:20:00')
          GROUP BY LINE_NO
          ) AS t2 
      ON t1.LINE_NO = t2.LINE_NO
    GROUP BY t1.LINE_NO, t1.E_FIELD, t1.F_FIELD, t1.G_FIELD, t1.HSA_STATUS, t1.FAMILY, t1.CACHE_FAMILY, t1.Total,t2.TotalOfLineNo
    ORDER BY t1.LINE_NO, t1.E_FIELD, t1.F_FIELD, t1.G_FIELD, t1.HSA_STATUS, t1.FAMILY, t1.CACHE_FAMILY, t1.Total,t2.TotalOfLineNo

【讨论】:

    【解决方案2】:

    使用Round函数

    select round(21.6080402010050,1)
    

    【讨论】:

      【解决方案3】:

      看看ROUND 函数。

      select round(21.6080402010050, 1)
      

      适用于 MS SQL Server 或 MySQL

      【讨论】:

      • 我也试过了。因为实际上有相当多的行。以上是一些选择查询执行后的输出
      • 返回多少行并不重要。下面的工作吗? round((convert(decimal(8,1),SUM(t1.TOTAL)) * 100 / t2.TotalOfLineNo ), 1) AS Percentage
      【解决方案4】:

      这应该适合你:

      SELECT ROUND(21.6080402010050,1)
      

      SQL Fiddle Demo

      它应该适用于大多数 RDBMS。

      您的编辑:

      ROUND((convert(decimal(8,1),SUM(t1.TOTAL)) * 100 / t2.TotalOfLineNo ),1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        相关资源
        最近更新 更多