Sql server 在SQL递归中使用MAX(Date)值

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

我有一个SQL查询,它根据从多个表中选择的MinDate和MaxDate执行递归。但当我尝试运行查询时,在递归公共表表达式“ctedaterange”的递归部分不允许使用GROUP BY、HAVING或AGGRATE函数。例外我也尝试过使用Top 1日期,但仍然没有希望

SQL查询

最重要的是,我需要将它包装到我的SQL视图中。对我问题的任何帮助都将不胜感激


谢谢,

您可以将聚合移动到额外的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