Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用多个CTE_Sql_Sql Server_Tsql_Common Table Expression - Fatal编程技术网

Sql 使用多个CTE

Sql 使用多个CTE,sql,sql-server,tsql,common-table-expression,Sql,Sql Server,Tsql,Common Table Expression,由于我使用Group BY for Months数据,每个CTE的结果都是重复的。这是问题所在查询的一部分。根据CTE上创建的列进行计算。 请帮个忙 DECLARE @StartDate datetime SET @StartDate='12/01/2012' WHILE @StartDate<'12/02/2012' --Set GETDATE() BEGIN WITH CTE3 (Parameter,Month3,Count3,Count2,Count1,DateRange,OrgID

由于我使用Group BY for Months数据,每个CTE的结果都是重复的。这是问题所在查询的一部分。根据CTE上创建的列进行计算。 请帮个忙

DECLARE @StartDate datetime
SET @StartDate='12/01/2012'
WHILE @StartDate<'12/02/2012' --Set GETDATE()
BEGIN
WITH CTE3 (Parameter,Month3,Count3,Count2,Count1,DateRange,OrgID)    
 AS    
  (    
  SELECT CAST(Col1 AS VARCHAR(50)) Parameter
  ,SUM(CASE WHEN DateRange=CAST(LEFT(DATENAME(MONTH,DATEADD(MONTH,DATEDIFF(M,0,@StartDate),0)),3) + '-' + DATENAME(YYYY,@StartDate) AS VARCHAR(50))
  THEN Col2 else 0 END) Month3
  ,(SELECT COUNT(Col1) FROM [Table_Name] 
  WHERE Col1='INS Charges'   
  AND DateRange = CAST(LEFT(DATENAME(MONTH,DATEADD(MONTH,DATEDIFF(M,0,@StartDate),0)),3) + '-' + DATENAME(YYYY,@StartDate) AS VARCHAR(50))) Count3
  ,(SELECT COUNT(Col1) FROM [Table_Name]
  WHERE DateRange = CAST(LEFT(DATENAME(MONTH,DATEADD(MONTH,DATEDIFF(M,0,@StartDate)-1,0)),3) + '-' + DATENAME(YYYY,@StartDate) AS VARCHAR(50))) Count2  
  ,(SELECT COUNT(Col1) FROM [Table_Name]   
  WHERE DateRange = CAST(LEFT(DATENAME(MONTH,DATEADD(MONTH,DATEDIFF(M,0,@StartDate)-2,0)),3) + '-' + DATENAME(YYYY,@StartDate) AS VARCHAR(50))) Count1  
  ,DateRange
  ,OrgID
  FROM [Table_Name]
  WHERE DateRange=CAST(LEFT(DATENAME(MONTH,DATEADD(MONTH,DATEDIFF(M,0,@StartDate),0)),3) + '-' + DATENAME(YYYY,@StartDate) AS VARCHAR(50))
  GROUP BY Col1,OrgID,DateRange
  )
  ,CTE2 (Parameter,Month2,DateRange,OrgID)
  AS
  (
    SELECT CAST(Col1 AS VARCHAR(50)) Parameter
    ,SUM(Col2) Month2
    ,DateRange
    ,OrgID
    from [Table_Name]
    WHERE DateRange= CAST(LEFT(DATENAME(MONTH,DATEADD(MONTH,DATEDIFF(M,0,@StartDate)-1,0)),3) + '-' + DATENAME(YYYY,@StartDate) AS VARCHAR(50))
    GROUP BY Col1,OrgID,DateRange
  )
  ,CTE1 (Parameter,Month1,DateRange,OrgID)
  AS
  (
    SELECT CAST(Col1 AS VARCHAR(50)) Parameter
    ,SUM(Col2) Month1
    ,DateRange
    ,OrgID
    from [Table_Name]
    WHERE DateRange= CAST(LEFT(DATENAME(MONTH,DATEADD(MONTH,DATEDIFF(M,0,@StartDate)-2,0)),3) + '-' + DATENAME(YYYY,@StartDate) AS VARCHAR(50))
    GROUP BY Col1,DateRange,OrgID
  )
  SELECT CTE3.Parameter    
  ,CTE1.Month1
  ,CTE2.Month2    
  ,CTE3.Month3
  ,CTE1.Month1+CTE2.Month2+CTE3.Month3 YTD
  ,(CTE1.Month1+CTE2.Month2+CTE3.Month3)/3 [3 Month Avg]
  ,Cte3.OrgID
  ,Cte3.DateRange
  FROM CTE3
  JOIN CTE1 ON CTE1.Parameter=CTE3.Parameter
  JOIN CTE2 ON CTE2.Parameter=CTE3.Parameter
  SET @StartDate=(SELECT DATEADD(M,1,@StartDate))
  END
这是一份过去3个月的报告,其中包含复杂的计算。如果您注意到表_名称只包含DateRange,我必须在此基础上在列中创建最近3个月的数据,并根据上述查询获取的数据,即Month1、Month2等,执行数学运算。这就是我选择CTE的原因

我能够生成结果,但唯一的问题是每列获得重复的行,因为每个CTE都有Group By

如果有其他选择,请让我知道


提前感谢

您可能应该在GROUP BY子句中的每个列上加入CTE-s,例如:

FROM CTE3
JOIN CTE1 ON CTE1.Parameter=CTE3.Parameter AND CTE1.OrgID=CTE3.OrgID AND CTE1.DateRange=CTE3.DateRange
JOIN CTE2 ON CTE2.Parameter=CTE3.Parameter AND CTE2.OrgID=CTE3.OrgID AND CTE2.DateRange=CTE3.DateRange

假设这些列不允许空值

,您能否创建一个包含所有必需功能的新过程?如果是,请共享过程代码。@Horaciux:请检查已编辑的查询。是否可以为表\u名称添加一些示例数据?我已更新了示例数据!!!希望对你有所帮助你想达到什么目标?你期望得到什么结果?不管是什么,这个问题似乎太复杂了。此外,同一个表的多次扫描、字符串操作等都会导致非常糟糕的性能
FROM CTE3
JOIN CTE1 ON CTE1.Parameter=CTE3.Parameter AND CTE1.OrgID=CTE3.OrgID AND CTE1.DateRange=CTE3.DateRange
JOIN CTE2 ON CTE2.Parameter=CTE3.Parameter AND CTE2.OrgID=CTE3.OrgID AND CTE2.DateRange=CTE3.DateRange