如圖,2019年3月以前都用8.9的單價,3月到8月也用8.9的單價,9月到10月都用9.0的單價,11月到12月都用9.1的單價,1月到2月都用9.5的單價,3月含以上沒維護資料統一按2020年3月的單價計算,依次類推,一段時間有資料就用新資料,沒有就抓取舊資料,SQL怎么實作,求大佬幫忙,謝謝
uj5u.com熱心網友回復:
這不就是個代入法的函式邏輯。把日期做為引數,傳入,回傳滿足條件的單價。
uj5u.com熱心網友回復:
大兄弟,我是新手,搞不來,幫忙看看咋寫呀
uj5u.com熱心網友回復:
用這個腳本:
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)即可進行匹配。
uj5u.com熱心網友回復:
我忘改完函式名了,都改成GetMonthAsPriceuj5u.com熱心網友回復:
大兄弟,您給的函式有月份的都能輸出單價,沒有維護的月份沒有單價,但是我想讓沒有維護的月份自動補全月份和單價按我題目要求的那樣輸出出來行不
uj5u.com熱心網友回復:
表里自動補全從2019年三月到2020年三月里沒有維護的月份和題目要求怎樣賦值的單價
uj5u.com熱心網友回復:
這個函式只是一個方法,只有識別了月份,才能獲取單價。這沒有月份的,這個方法當然識別不了。
要想補齊月份,是要在你寫的查詢腳本里,別的邏輯方式去實作。
具體的,得你自己想想是個什么樣的邏輯。你沒有具體的業務背景,我幫不了你
uj5u.com熱心網友回復:
那好吧,多謝大兄弟指點
uj5u.com熱心網友回復:
沒事。。。。uj5u.com熱心網友回復:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/52330.html
標籤:疑難問題
上一篇:我在做學生選課系統,現在html頁面顯示課程資料,選課后已選人數加1,selectNum是已選人數
下一篇:初學者
