【问题标题】:SUM amount field without commas, decimals, nor negative sign 11 digit leading zeros不带逗号、小数和负号的 SUM 金额字段 11 位前导零
【发布时间】:2017-10-03 16:31:48
【问题描述】:

以下选择要求:

  1. 美元金额字段 11 个字符,前导零
  2. 没有逗号、小数点或负号
  3. 当前导零、REPLACE 小数、逗号和负号正常工作时,我收到一个错误,即 varchar 未用于 SUM。当 CAST as Numeric 时,所有逗号、小数和负号都会显示。

CASE WHEN psg_postingtransactions.[AMOUNT] != 0 THEN CAST(REPLACE(REPLACE(REPLICATE('0',12-LEN(RTRIM(psg_postingtransactions [AMOUNT])))+RTRIM(psg_postingtransactions.[AMOUNT]),'.',''), '-', '0') AS NUMERIC) ELSE '00000000000' END

【问题讨论】:

  • 请举一个输入的例子和你想要的输出
  • 输入将是 12345.67。输出将是 00001234567
  • 输入将是 12345.67。输出将是 00001234567。如果输入 -12345.67,结果仍然是 00001234567

标签: mysql


【解决方案1】:

在 MySQL 中试试这个:

LPAD(FLOOR(ABS(AMOUNT)*100),11,'0')

但是您的 SQL 看起来像是 TSQL (MS SQL Server) 而不是 MySQL,请参阅SQL Fiddle

假设你确实想要它用于 TSQL,那么试试这个:

RIGHT(CONCAT('00000000000',CAST(ABS([AMOUNT])*100 AS INT)),11) AS LEADZERO
  1. ABS() 删除减号
  2. *100 将在结果转换为整数后删除 2 位小数
  3. CONCAT() 在整数前面放置一串零
  4. RIGHT(...,7) 只需要我们输出所需字符串的 7 个字符

或者,您可以使用 floor() 代替 cast()

RIGHT(CONCAT('00000000000',floor(ABS([AMOUNT])*100)),11) AS LEADZERO

.

CREATE TABLE psg_postingtransactions
    ([AMOUNT] decimal(11,2))
;

INSERT INTO psg_postingtransactions
    ([AMOUNT])
VALUES
    (0),
    (123.45),
    (45678.1),
    (-12.56)
;

查询 1

SELECT
   RIGHT(CONCAT('00000000000',cast(ABS([AMOUNT])*100 AS INT)),7) AS LEADZERO
FROM psg_postingtransactions

Results

|   LEADZERO   |
|--------------|
|  00000000000 |
|  00000012345 |
|  00004567810 |
|  00000001256 |

【讨论】:

  • 不知道为什么,但我使用长度为 7 而不是 11 准备了上面引用的 sqlfiddle。我修改了上面看到的答案,但没有修改 sqlfiddle。
  • 与 SQL Server 2012 配合得很好。你对 SQL Server 2008 有什么建议吗。我希望不要碰到 v2008 但有时我必须使用的唯一一台 sql server 机器。
  • 我认为只有 concat () 是 2008 年的问题,所以尝试RIGHT(('00000000000'+cast(floor(ABS([AMOUNT])*100)) as varchar),11)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多