请各路高手指点,SQL 两列计算的问题

贵生 2014-10-10 09:24:40
有一组数据


ID A B
--------------
1 0.3 ?

2 2 ?



B列的数据公式如下,

B1 = (B2*0.01)*(A1*0.01)


注:ID号最大的B字段值=A字段值,如上例B2=A2=2

请教,如何用SQL语句写出?



...全文
133 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
贵生 2014-10-10
  • 打赏
  • 举报
回复
问题解决!结贴!非常感谢ky_min兄!感谢bw555版主!
还在加载中灬 2014-10-10
  • 打赏
  • 举报
回复
你错了,语句倒数第三行 是 Select T1.*,CAST((((T2.B*0.01
贵生 2014-10-10
  • 打赏
  • 举报
回复
引用 12 楼 ky_min 的回复:
[quote=引用 11 楼 winds123 的回复:]
[quote=引用 9 楼 ky_min 的回复:]
[quote=引用 6 楼 winds123 的回复:]
谢ky_min回复!

ID是递增的,我刚刚用你的语句试了一下,倒数第一、二列的结果是正确,但是第三列就不对了

A B(正确值应如下)
---------------------------------
0 3.538
0 3.538
0.1 3.538
0.1 3.434
1 3.33
0.3 2.306
2 2

B列计算公式 :
(T2.B*0.01)+1)*((T1.A*0.01)+1)-1)*100
找到原因了,从下往上数第三行,正确的值是 3.32906000000 不是3.33
而你根据3.33 算出来的,自然也开始不一样了[/quote]

要怎么处理,最终的结果是小数点后要保留4位[/quote]把DECIMAL(19,6)换成DECIMAL(19,4)不过 倒数第三行还是不是3.33而是3.3291[/quote]

实际代进去还是不对,红框内的数据不正确

还在加载中灬 2014-10-10
  • 打赏
  • 举报
回复
引用 11 楼 winds123 的回复:
[quote=引用 9 楼 ky_min 的回复:] [quote=引用 6 楼 winds123 的回复:] 谢ky_min回复! ID是递增的,我刚刚用你的语句试了一下,倒数第一、二列的结果是正确,但是第三列就不对了 A B(正确值应如下) --------------------------------- 0 3.538 0 3.538 0.1 3.538 0.1 3.434 1 3.33 0.3 2.306 2 2 B列计算公式 : (T2.B*0.01)+1)*((T1.A*0.01)+1)-1)*100
找到原因了,从下往上数第三行,正确的值是 3.32906000000 不是3.33 而你根据3.33 算出来的,自然也开始不一样了[/quote] 要怎么处理,最终的结果是小数点后要保留4位[/quote]把DECIMAL(19,6)换成DECIMAL(19,4)不过 倒数第三行还是不是3.33而是3.3291
贵生 2014-10-10
  • 打赏
  • 举报
回复
引用 9 楼 ky_min 的回复:
[quote=引用 6 楼 winds123 的回复:] 谢ky_min回复! ID是递增的,我刚刚用你的语句试了一下,倒数第一、二列的结果是正确,但是第三列就不对了 A B(正确值应如下) --------------------------------- 0 3.538 0 3.538 0.1 3.538 0.1 3.434 1 3.33 0.3 2.306 2 2 B列计算公式 : (T2.B*0.01)+1)*((T1.A*0.01)+1)-1)*100
找到原因了,从下往上数第三行,正确的值是 3.32906000000 不是3.33 而你根据3.33 算出来的,自然也开始不一样了[/quote] 要怎么处理,最终的结果是小数点后要保留4位
贵生 2014-10-10
  • 打赏
  • 举报
回复
ky_min兄,是我搞了乌龙,表名应是test
还在加载中灬 2014-10-10
  • 打赏
  • 举报
回复
引用 6 楼 winds123 的回复:
谢ky_min回复! ID是递增的,我刚刚用你的语句试了一下,倒数第一、二列的结果是正确,但是第三列就不对了 A B(正确值应如下) --------------------------------- 0 3.538 0 3.538 0.1 3.538 0.1 3.434 1 3.33 0.3 2.306 2 2 B列计算公式 : (T2.B*0.01)+1)*((T1.A*0.01)+1)-1)*100
找到原因了,从下往上数第三行,正确的值是 3.32906000000 不是3.33 而你根据3.33 算出来的,自然也开始不一样了
还在加载中灬 2014-10-10
  • 打赏
  • 举报
回复
提示tmpng对象不存在 这个 你还是把你替换的语句贴出来~~ 然后上一个问题,可能是精度问题,我调下看下
贵生 2014-10-10
  • 打赏
  • 举报
回复
谢两位! 我用自己的实际表和字段代进去,都有错误 表名:tmpng 其中字段:id,bd 版主的语句提示:over处有错误 ky_min兄的提示tmpng对象不存在 请两位再帮忙看看
贵生 2014-10-10
  • 打赏
  • 举报
回复
谢ky_min回复! ID是递增的,我刚刚用你的语句试了一下,倒数第一、二列的结果是正确,但是第三列就不对了 A B(正确值应如下) --------------------------------- 0 3.538 0 3.538 0.1 3.538 0.1 3.434 1 3.33 0.3 2.306 2 2 B列计算公式 : (T2.B*0.01)+1)*((T1.A*0.01)+1)-1)*100
bw555 2014-10-10
  • 打赏
  • 举报
回复
试一下
SELECT ID,A, exp(sum(log(A*0.01*0.01))/0.01/0.01 OVER(ORDER BY ID DESC) B
FROM T
还在加载中灬 2014-10-10
  • 打赏
  • 举报
回复
我改进了一下,如果ID递增不固定为1 可以使用如下
WITH ROWCTE AS(
	SELECT ROW_NUMBER()OVER(ORDER BY ID) RN,* FROM 你的表
)
,CTE AS(
	SELECT TOP 1 *,CAST(A AS DECIMAL(19,6)) B FROM ROWCTE ORDER BY ID DESC
	UNION ALL
	SELECT T1.*,CAST(T2.B*0.01*T1.A*0.01 AS DECIMAL(19,6)) FROM ROWCTE T1 INNER JOIN CTE T2 ON T1.RN+1=T2.RN
)
SELECT ID,A,B FROM CTE ORDER BY ID
bw555 2014-10-10
  • 打赏
  • 举报
回复
分析了下,其实就是要实现一个累乘的功能,给你个累乘的语句,参考

--按照A分组,按照B排序,累乘C
select A,B,
exp(sum(log(C)) over(partition by A order by B)) RESULT
from T
还在加载中灬 2014-10-10
  • 打赏
  • 举报
回复
WITH CTE AS(
	SELECT TOP 1 *,CAST(A AS DECIMAL(19,6)) B FROM 你的表 ORDER BY ID DESC
	UNION ALL
	SELECT T1.*,CAST(T2.B*0.01*T1.A*0.01 AS DECIMAL(19,6)) FROM 你的表 T1 INNER JOIN CTE T2 ON T1.ID+1=T2.ID
)
SELECT * FROM CTE ORDER BY ID
不知道你的意思是不是这样,ID是递增为1吗?DECIMAL(19,6)换成你要的精确度
贵生 2014-10-10
  • 打赏
  • 举报
回复
自己顶一下。

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧