求大佬帮忙看看这个SQL怎么写

jx-lpcx 2020-03-14 09:44:11
如图,2019年3月以前都用8.9的单价,3月到8月也用8.9的单价,9月到10月都用9.0的单价,11月到12月都用9.1的单价,1月到2月都用9.5的单价,3月含以上没维护数据统一按2020年3月的单价计算,依次类推,一段时间有数据就用新数据,没有就抓取旧数据,SQL怎么实现,求大佬帮忙,谢谢
...全文
194 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
RINK_1 2020-03-17
  • 打赏
  • 举报
回复

CREATE TABLE #T
(EFFECTDATE DATE,
 PRICE DECIMAL(12,2))

 INSERT INTO #T
 SELECT '2019-03-01',8.9 UNION ALL
 SELECT '2019-09-01',9 UNION ALL
 SELECT '2019-11-01',9.1 UNION ALL
 SELECT '2020-01-01',9.5 UNION ALL
 SELECT '2020-03-01',9.2


 DECLARE @BEGIN_DATE DATE
 DECLARE @END_DATE DATE

 SET @BEGIN_DATE='2019-01-01'
 SET @END_DATE='2020-12-01'

 ;WITH CTE
 AS
 (SELECT DATEADD(MONTH,NUMBER,@BEGIN_DATE) AS SINGEL_MONTH
 FROM MASTER.DBO.SPT_VALUES A
 JOIN (SELECT DATEDIFF(MONTH,@BEGIN_DATE,@END_DATE) AS DATE_DIFF) AS B ON A.NUMBER<=B.DATE_DIFF
 WHERE TYPE='P')

 SELECT A.*,ISNULL(B.PRICE,ISNULL(C.MIN_PRICE,D.MAX_PRICE)) FROM CTE A
 LEFT JOIN #T B ON A.SINGEL_MONTH=B.EFFECTDATE
 OUTER APPLY (SELECT TOP 1 PRICE AS MIN_PRICE FROM #T WHERE EFFECTDATE<A.SINGEL_MONTH ORDER BY EFFECTDATE DESC) AS C
 OUTER APPLY (SELECT TOP 1 PRICE AS MAX_PRICE FROM #T WHERE EFFECTDATE>A.SINGEL_MONTH ORDER BY EFFECTDATE) AS D


morliz子轩 2020-03-16
  • 打赏
  • 举报
回复
这个函数只是一个方法,只有识别了月份,才能获取单价。 这没有月份的,这个方法当然识别不了。 要想补齐月份,是要在你写的查询脚本里,别的逻辑方式去实现。 具体的,得你自己想想是个什么样的逻辑。你没有具体的业务背景,我帮不了你
morliz子轩 2020-03-16
  • 打赏
  • 举报
回复
没事。。。。
jx-lpcx 2020-03-16
  • 打赏
  • 举报
回复
引用 7 楼 morliz子轩的回复:
这个函数只是一个方法,只有识别了月份,才能获取单价。 这没有月份的,这个方法当然识别不了。 要想补齐月份,是要在你写的查询脚本里,别的逻辑方式去实现。 具体的,得你自己想想是个什么样的逻辑。你没有具体的业务背景,我帮不了你
那好吧,多谢大兄弟指点
jx-lpcx 2020-03-14
  • 打赏
  • 举报
回复
引用 4 楼 morliz子轩的回复:
我忘改完函数名了,都改成GetMonthAsPrice
表里自动补全从2019年三月到2020年三月里没有维护的月份和题目要求怎样赋值的单价
jx-lpcx 2020-03-14
  • 打赏
  • 举报
回复
引用 4 楼 morliz子轩的回复:
我忘改完函数名了,都改成GetMonthAsPrice
大兄弟,您给的函数有月份的都能输出单价,没有维护的月份没有单价,但是我想让没有维护的月份自动补全月份和单价按我题目要求的那样输出出来行不
morliz子轩 2020-03-14
  • 打赏
  • 举报
回复
我忘改完函数名了,都改成GetMonthAsPrice
morliz子轩 2020-03-14
  • 打赏
  • 举报
回复
用这个脚本:

if object_id (N'Fn_GetMonthAsPrice') is not null
	drop function [dbo].[Fn_GetMonthAsPrice]
go

create function [dbo].[Fn_GetAccountMonth](@Date varchar(30))
returns DECIMAL (10,2)
as
begin
	DECLARE @WaterPrice DECIMAL (10,2)

	SELECT @WaterPrice = wasteWaterPrice from tblBase_Wastewater_Price 
         WHERE @Date = convert(varchar(7),effectdate,120) 

	RETURN @WaterPrice

END

GO



基本就是这样写,要注意看下传入的字段,是date还是datetime,直接把它转换成varchar(7)即可进行匹配。
jx-lpcx 2020-03-14
  • 打赏
  • 举报
回复
引用 1 楼 morliz子轩的回复:
这不就是个代入法的函数逻辑。 把日期做为参数,传入,返回满足条件的单价。
大兄弟,我是新手,搞不来,帮忙看看咋写呀
morliz子轩 2020-03-14
  • 打赏
  • 举报
回复
这不就是个代入法的函数逻辑。 把日期做为参数,传入,返回满足条件的单价。

22,207

社区成员

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

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