2017-08-24 99 views
-1

我需要将一个金额(数量)分解为组件,例如,58963的金额将被分解为50000,8000,900,60和3,我如何在sql中实现这一点使用函数,任何想法?金额分解 - SQL

问候,

伊尔凡

+6

你应该做的是在你的程序逻辑,而不是在SQL –

+2

这也可能是家庭作业,因此这可能不是一个选项。 – MSalters

+1

您正在使用哪个[DBMS](https://en.wikipedia.org/wiki/DBMS)? Postgres的?甲骨文? –

回答

1

对于SQL Server

DECLARE @num INT = 58963; 

with decList as 
(
    select 10 AS decNum 
    union all 
    select decNum * 10 AS dt 
    from decList 
    where decNum <= @num 
) 
select CASE WHEN decNum > 10 
      THEN ((@num % decNum)/(decNum/10)) * (decNum/10) 
      ELSE @num % decNum 
     END 
from decList 
+1

这是有效的,但我们必须改变每个数字的变化 – TheGameiswar

+0

true,我会尝试更新 –

1

尝试

DECLARE @amount INT = 58963 
DECLARE @temp INT 
DECLARE @i INT = 0 

DECLARE @tempStore TABLE(val int) 

WHILE(@amount>0) 
BEGIN 
    SET @temp = @amount % 10; 
    SET @amount = @amount /10; 
    INSERT INTO @tempStore VALUES(@temp * POWER(10, @i)) 
    SET @i = @i+1; 
END 

SELECT * FROM @tempStore ORDER BY val DESC 

可以使用bigint,而不是int如果该值不适合在整数的范围。

如果你想要得到的逗号分隔输出尝试

DECLARE @amount BIGINT = 589625 
DECLARE @temp BIGINT 
DECLARE @i INT = 0 

DECLARE @tempStore TABLE(val BIGINT) 

WHILE(@amount>0) 
BEGIN 
    SET @temp = @amount % 10; 
    SET @amount = @amount /10; 
    INSERT INTO @tempStore VALUES(@temp * POWER(10, @i)) 
    SET @i = @i+1; 
END 

DECLARE @tmp VARCHAR(MAX)= '' 
select @tmp = @tmp + CONVERT(VARCHAR(100), val) + ', ' from @tempStore ORDER BY val DESC 

select SUBSTRING(@tmp, 0, LEN(@tmp)) 

如果你想用数据库的方式,而不是一般的编程逻辑(不想while循环中)来实现这点,你可以试试

DECLARE @amount AS INT = 58963; 
;WITH cte 
     AS (SELECT 1 AS n, @amount AS m, 1 as p, 1 as r 
      UNION ALL 
      SELECT (cte.m%10), (cte.m/10), (cte.p*10), ((cte.m%10) * (cte.p*10))/10 
      FROM cte 
      WHERE cte.m > 0 
     ) 

SELECT cte.r --,* 
FROM cte WHERE (cte.n*cte.p)/10 > 0 
--ORDER BY cte.r DESC 
0

这应该适用于任何数量。

DECLARE @amount AS INT = 58963; 

WITH cte 
      AS (SELECT 1 AS n 
       UNION ALL 
       SELECT cte.n * 10 
       FROM  cte 
       WHERE cte.n < @amount/10 
      ) 
    SELECT ((@amount % (cte.n * 10))/cte.n) * cte.n 
    FROM cte; 
+0

您可以使用'WHERE cte.n <@amount/10'而不是'WHERE cte.n * 10 <@金额“来产生10的幂。它将确保你对整数n的情况不会溢出。 –

+1

@NoorAShuvo好点。 –