2017-08-24 65 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好點。 –