Sql server 在SQL递归中使用MAX(Date)值
我有一个SQL查询,它根据从多个表中选择的MinDate和MaxDate执行递归。但当我尝试运行查询时,在递归公共表表达式“ctedaterange”的递归部分不允许使用GROUP BY、HAVING或AGGRATE函数。例外我也尝试过使用Top 1日期,但仍然没有希望 SQL查询 最重要的是,我需要将它包装到我的SQL视图中。对我问题的任何帮助都将不胜感激Sql server 在SQL递归中使用MAX(Date)值,sql-server,Sql Server,我有一个SQL查询,它根据从多个表中选择的MinDate和MaxDate执行递归。但当我尝试运行查询时,在递归公共表表达式“ctedaterange”的递归部分不允许使用GROUP BY、HAVING或AGGRATE函数。例外我也尝试过使用Top 1日期,但仍然没有希望 SQL查询 最重要的是,我需要将它包装到我的SQL视图中。对我问题的任何帮助都将不胜感激 谢谢,您可以将聚合移动到额外的cte,因此这可能是您想要的: ALTER VIEW [dbo].[CYExtraction] (PK
谢谢,您可以将聚合移动到额外的cte,因此这可能是您想要的:
ALTER VIEW [dbo].[CYExtraction]
(PK_Date, [Month], [Quarter], [HalfYear], [Year], [DateName])
AS
WITH cteAllItems (mindates, maxdates) AS (
SELECT MIN(CreatedOn), MAX(CreatedOn) FROM Items
UNION ALL
SELECT MIN(CreatedOn), MAX(CreatedOn) FROM Bibs
UNION ALL
SELECT MIN(CreatedOn), MAX(CreatedOn) FROM Porders
),
ctedaterange (Dates, MaxDate) AS (
SELECT MIN(mindates), MAX(maxdates)
FROM cteAllItems
UNION ALL
SELECT DATEADD(day, 1, Dates), MaxDate
FROM ctedaterange
WHERE DATEADD(day, 1, Dates) <= MaxDate
)
SELECT
Dates AS PK_Date,
DATENAME(MONTH, Dates) + N' ' + DATENAME(YEAR, Dates),
N'Q' + DATENAME(QUARTER, Dates) + N' ' + DATENAME(YEAR, Dates),
N'HY' + CAST((MONTH(Dates)-1)/6+1 AS nvarchar(1)) + N' ' + DATENAME(YEAR, Dates),
YEAR(Dates),
CONVERT(nvarchar(10), DATEADD(MONTH, DATEDIFF(MONTH, 0, Dates), 0), 105)
FROM ctedaterange
GO
你为什么选择一分钟中的一分钟?你认为这是在完成什么?我敢打赌这可能是这个查询中许多错误中的第一个。很难从代码中推断出您的意图。
ALTER VIEW [dbo].[CYExtraction]
(PK_Date, [Month], [Quarter], [HalfYear], [Year], [DateName])
AS
WITH cteAllItems (mindates, maxdates) AS (
SELECT MIN(CreatedOn), MAX(CreatedOn) FROM Items
UNION ALL
SELECT MIN(CreatedOn), MAX(CreatedOn) FROM Bibs
UNION ALL
SELECT MIN(CreatedOn), MAX(CreatedOn) FROM Porders
),
ctedaterange (Dates, MaxDate) AS (
SELECT MIN(mindates), MAX(maxdates)
FROM cteAllItems
UNION ALL
SELECT DATEADD(day, 1, Dates), MaxDate
FROM ctedaterange
WHERE DATEADD(day, 1, Dates) <= MaxDate
)
SELECT
Dates AS PK_Date,
DATENAME(MONTH, Dates) + N' ' + DATENAME(YEAR, Dates),
N'Q' + DATENAME(QUARTER, Dates) + N' ' + DATENAME(YEAR, Dates),
N'HY' + CAST((MONTH(Dates)-1)/6+1 AS nvarchar(1)) + N' ' + DATENAME(YEAR, Dates),
YEAR(Dates),
CONVERT(nvarchar(10), DATEADD(MONTH, DATEDIFF(MONTH, 0, Dates), 0), 105)
FROM ctedaterange
GO