SQL Server格式化所选数据的负值

时间:2017-08-18 22:49:15

标签: sql sql-server tsql

我是stackoverflow的新手,但我经常搜索它。

我正在根据数据创建报告,我必须格式化负数,例如

-00000010  (9 characters max)

我得到了这个, 000000-10

这就是我现在正在尝试的但是我遇到了问题。任何帮助将不胜感激。

SELECT 'H' 
    + DG.BLOCK 
    + LEFT(DG.ZIP,5) 
    + RIGHT('000000000' 
    + CAST(CAST(SUM(DG.WP)AS INT) AS VARCHAR(9)),9) 
    + RIGHT('000000000' + CAST(CAST(SUM(DG.WE)AS INT) AS VARCHAR(9)),9)
    + RIGHT('000000000' + CAST(CAST(SUM(DG.EP)AS INT) AS VARCHAR(9)),9) 
    + RIGHT('000000000' + CAST(CAST(SUM(DG.EE)AS INT) AS VARCHAR(9)),9)
    + RIGHT('000000000' + CAST(CAST(COUNT(DGG.CLAIMCONTROL)AS INT) AS VARCHAR(9)),9)
    + RIGHT('000000000' + CAST(CAST(SUM(DGG.INC) AS INT) AS VARCHAR(9)),9)
    + RIGHT('000000000' + CAST(CAST(SUM(DGG.PAID)AS INT) AS VARCHAR(9)),9)
    + RIGHT('000000000' + CAST(CAST(SUM(DGG.ALAE) AS INT) AS VARCHAR(9)),9) 
AS [H Record]
FROM TABLE

4 个答案:

答案 0 :(得分:0)

如果是2012+,您可以选择Format()。

示例

try:
  numbers = [int(n) for n in input('Space-separated integers, please: ').split()]
except ValueError as e:
  print('I needed numbers. You gave me something else.')

<强>返回

input

请注意。 Format()有一些很棒的功能,但不知道它是一个高性能。

答案 1 :(得分:0)

以下代码演示了将数据格式化为9位加上可选符号或固定9个字符(包括符号)。

-- Sample data.
declare @Samples as Table ( Sample Int );
insert into @Samples ( Sample ) values ( 0 ), ( 1 ), ( -10 ), ( 100 ), ( -1000 );

-- Format the data.
select Sample,
  case when Sign( Sample ) = -1 then '-' else '' end +
    Right( Replicate( '0', 8 ) + Cast( Abs( Sample ) as VarChar(9) ), 9 ) as FormattedSample9PlusSign,
  case when Sign( Sample ) = -1 then
    '-' + Right( Replicate( '0', 7 ) + Cast( -Sample as VarChar(8) ), 8 ) else
    Right( Replicate( '0', 8 ) + Cast( Sample as VarChar(9) ), 9 ) end as FormattedSample9
  from @Samples;

提示:在SSMS中,使用查询结果到文本(Ctrl-T)以便于显示。

答案 2 :(得分:0)

如果您没有v2012 +:

,可以试试这个
DECLARE @mockup TABLE(SomeNumber INT);
DECLARE @padWidth INT=3;
INSERT INTO @mockup VALUES(-1000),(-500),(-1),(0),(1),(500),(1000);

SELECT CASE WHEN m.SomeNumber < 0 THEN '-' ELSE ' ' END 
     + REPLACE(STR(ABS(m.SomeNumber),@padWidth),' ','0')
FROM @mockup AS m;

数字很大,将以***的形式返回。这比使用RIGHTLEFT剪切字符串的其他方法更好。他们可能会返回一个糟糕的结果......

返回

-***
-500
-001
 000
 001
 500
 ***

答案 3 :(得分:0)

在 DB2 中,这可以获取包括符号在内的 15 位数字:

CASE WHEN MYNUMBER < 0 THEN '-'  ||   LPAD(MYNUMBER , 14, 0) 
                       ELSE LPAD(MYNUMBER , 15, 0)                                   
END