当前位置: 代码迷 >> Sql Server >> 怎么写列的累乘SQL语句?(分不够只能发这里了:-))
  详细解决方案

怎么写列的累乘SQL语句?(分不够只能发这里了:-))

热度:83   发布时间:2016-04-24 09:52:54.0
如何写列的累乘SQL语句?(分不够只能发这里了:-))
累乘的SQL写法

ID   A      B

1    0.2    A1*A2*A3 = 0.024

2    0.3   A2*A3 = 0.12
 
3    0.4   0.4

请问用SQL怎么写出来?
------解决思路----------------------
非技术区,可以0分贴啊~~
你参考一下
;WITH ROWCTE AS(
SELECT ROW_NUMBER()OVER(ORDER BY ID) RN,* FROM 你的表
)
,CTE AS(
SELECT TOP 1 *,CAST(A AS DECIMAL(19,4)) B FROM ROWCTE ORDER BY ID DESC
UNION ALL
SELECT T1.*,CAST(T2.B*T1.A AS DECIMAL(19,4)) FROM ROWCTE T1 INNER JOIN CTE T2 ON T1.RN+1=T2.RN
)
SELECT * FROM CTE ORDER BY ID

/*结果如下
1 1 0.2000 0.0240
2 2 0.3000 0.1200
3 3 0.4000 0.4000*/

------解决思路----------------------
引用:
按照ky_min兄的答案我代进去的,只是不清楚倒数第二行开始的数值跟上图中的正确值有差别


引用:


最右是B列的求值公式,就是累乘,但是不知未何在SQL中运行语句所得值跟EXCEL文件中的不一样,倒数第二列开始不一样,要比正确值大

你要递归的是里面的乘积M,而不是结果B
;WITH tmpng(ID,BD) AS (
    SELECT 0,Convert(real,0.0) UNION ALL
    SELECT 1,0.0 UNION ALL
    SELECT 2,0.1 UNION ALL
    SELECT 3,0.1 UNION ALL
    SELECT 4,1.0 UNION ALL
    SELECT 5,0.3 UNION ALL
    SELECT 6,2.0 
)
,ROWCTE AS(
SELECT ROW_NUMBER()OVER(ORDER BY ID) RN,* FROM tmpng
)
,CTE AS(
    SELECT TOP 1 *,
               1/(1-BD*0.01) M,
               CAST( ROUND( (1/(1-BD*0.01)-1)*100 ,4) AS DECIMAL(19,3)) B
          FROM ROWCTE
      ORDER BY ID DESC
UNION ALL
    SELECT T1.*,
               T2.M*1/(1-T1.BD*0.01) M,
               CAST( ROUND( (T2.M*1/(1-T1.BD*0.01)-1)*100 ,4) AS DECIMAL(19,3)) B
          FROM ROWCTE T1
    INNER JOIN CTE T2
            ON T1.RN+1=T2.RN
)
SELECT * FROM CTE ORDER BY ID

   RN   ID    BD                      M       B
----- ---- ----- ---------------------- -------
    1    0     0       1.03588750585399   3.589
    2    1     0       1.03588750585399   3.589
    3    2   0.1       1.03588750585399   3.589
    4    3   0.1       1.03485161834814   3.485
    5    4     1       1.03381676672979   3.382
    6    5   0.3       1.02347859906249   2.348
    7    6     2       1.02040816326531   2.041
  相关解决方案