Sql 使用多个CTE
由于我使用Group BY for Months数据,每个CTE的结果都是重复的。这是问题所在查询的一部分。根据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
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