Я запрашиваю среднемесячную ставку по всем продуктам, среднюю по всем пятницам за месяц.Мой скрипт таблицы и данных:
CREATE TABLE [dbo].[Product_Entry](
[ProductCode] [varchar](10) NOT NULL,
[Rate] [decimal](18, 0) NULL,
[RateDate] [date] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[Product_Entry] ([ProductCode], [Rate], [RateDate]) VALUES (N'050101', CAST(56 AS Decimal(18, 0)), CAST(N'2019-04-05' AS Date))
GO
INSERT [dbo].[Product_Entry] ([ProductCode], [Rate], [RateDate]) VALUES (N'050102', CAST(60 AS Decimal(18, 0)), CAST(N'2019-04-05' AS Date))
GO
INSERT [dbo].[Product_Entry] ([ProductCode], [Rate], [RateDate]) VALUES (N'050103', CAST(65 AS Decimal(18, 0)), CAST(N'2019-04-04' AS Date))
GO
INSERT [dbo].[Product_Entry] ([ProductCode], [Rate], [RateDate]) VALUES (N'050101', CAST(50 AS Decimal(18, 0)), CAST(N'2019-04-12' AS Date))
GO
INSERT [dbo].[Product_Entry] ([ProductCode], [Rate], [RateDate]) VALUES (N'050102', CAST(64 AS Decimal(18, 0)), CAST(N'2019-04-11' AS Date))
GO
INSERT [dbo].[Product_Entry] ([ProductCode], [Rate], [RateDate]) VALUES (N'050103', CAST(70 AS Decimal(18, 0)), CAST(N'2019-04-12' AS Date))
GO
INSERT [dbo].[Product_Entry] ([ProductCode], [Rate], [RateDate]) VALUES (N'050101', CAST(55 AS Decimal(18, 0)), CAST(N'2019-04-15' AS Date))
GO
INSERT [dbo].[Product_Entry] ([ProductCode], [Rate], [RateDate]) VALUES (N'050102', CAST(50 AS Decimal(18, 0)), CAST(N'2019-04-16' AS Date))
GO
INSERT [dbo].[Product_Entry] ([ProductCode], [Rate], [RateDate]) VALUES (N'050103', CAST(68 AS Decimal(18, 0)), CAST(N'2019-04-17' AS Date))
GO
Итак, я создаю функцию, которая принимает месяц и год и возвращает все пятницы
CREATE PROCEDURE [dbo].[GetallFridaysinMonth] (
@month VARCHAR(2) = NULL
,@year VARCHAR(5) = NULL
)
AS
BEGIN
SELECT Fridays = DATEADD(yy, DATEDIFF(yy, 0, '' + @year + '-' + @month + '-' + '01'), n.num)
INTO #t
FROM (
SELECT TOP 366 num = ROW_NUMBER() OVER (
ORDER BY a.NAME
) - 1
FROM dbo.syscolumns a
,dbo.syscolumns b
) n
WHERE DATENAME(weekday, DATEADD(yy, DATEDIFF(yy, 0, '' + @year + '-' + @month + '-' + '01'), n.num)) = 'Friday'
SELECT Fridays
FROM #t
WHERE datepart(month, Fridays) = @month
DROP TABLE #t
END
Затем использую эту функцию для запроса средних значений
BEGIN
CREATE TABLE #t121 (Fridays DATETIME,id INT IDENTITY(1, 1));
INSERT INTO #t121 (Fridays)
EXEC dbo.GetallFridaysinMonth @month,@year;
SELECT ProductCode
,convert(DECIMAL(18), avg(Rate)) AS AverageRate
FROM dbo.product_entry
WHERE RateDate IN (
SELECT Fridays
FROM #t121
)
GROUP BY ProductCode
DROP TABLE #t121
END
Это работает очень хорошо до тех пор, пока мой клиент не изменит требование и скажет, что если в пятницу не будет тарифа, тогда проверьте в четверг, если не в четверг, то проверка в среду означает возврат к субботе, чтобы определить, что курс недели.
Теперь, если есть только 2 или 3 продукта, я могу использовать условие Case, но не знаю, как выполнить возврат для всех продуктов, которые превышают 250.
Мой ожидаемый результат демонстрационных данных -
ProductCode AverageRate
-------------------------
050101 54
050102 58
050103 68
После завершения.
Пожалуйста, помогите мне решить эту проблему.Благодарю.