问个sql语句看看怎么写呀?

[复制链接]
查看11 | 回复4 | 2010-3-1 11:19:07 | 显示全部楼层 |阅读模式
供应商(gys)
期间(qj)
金额(je)
任务额(rwe)
返利点(fld)
返利额(fle)
A
01
10000
5000
0.1
1000
A
02
10000
5000
0.1
900
如上图,供应商返利计算表
1月份供应商的返利金额大于任务额返利额=金额*返利点
2月份供应商的返利金额大于任务额返利额=(金额-1月份返利额)*返利点
以后月份依次类推
这样的语句应该怎么写呀,谢谢。
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
首先,有个问题
3月份是要减去1月+2月,还是只减2月
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
如果上面的答复是只减去2月,那么sql就是:
WITH my1 AS (

SELECT *,

CASE

WHEN je > rwe THEN (je * fld)

ELSE 0

END fle

FROM tb

WHEREqj = 1

UNION ALL

SELECT tb.*,

CASE

WHEN tb.je > tb.rwe THEN ((tb.je - my1.fle) * tb.fld)

ELSE 0

END fle

FROM my1,

tb

WHEREtb.qj = my1.qj + 1

)
SELECT * FROM my1
在SqlServer2005下测试通过,注意:这个sql假设1到12月的数据全部存在,如果断月,需要你自己微调,比如qj=1条件改成qj=(select min(qj) from tb)
[ 本帖最后由 youbl 于 2011-1-13 11:37 编辑 ]
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
如果2楼的回答是需要减去1月和2月的返利额,那么sql就是:
WITH my1 AS (

SELECT *,

CASE

WHEN je > rwe THEN (je * fld)

ELSE 0

END fle,

CAST(0 AS FLOAT) tmp

FROM tb

WHEREqj = 1

UNION ALL

SELECT tb.*,

CASE

WHEN tb.je > tb.rwe THEN (tb.je - my1.fle -my1.tmp)

* tb.fld

ELSE 0

END fle,

my1.fle + my1.tmp tmp -- 用于累加

FROM my1,

tb

WHEREtb.qj = my1.qj + 1

)
SELECT *
FROM my1
同样,这个在SqlServer2005下测试通过,注意:这个sql假设1到12月的数据全部存在,如果断月,需要你自己微调,比如qj=1条件改成qj=(select min(qj) from tb)
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
我写的虽然通过,但是复杂了点,使用了递归实现,希望有大拿能简化,呵呵
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行