select
ROW_NUMBER()OVER(PARTITION BY [ConsLookUpID] ORDER BY [ConsLookUpID]) as [Write-off-Count]
,CASE
WHEN ROW_NUMBER()OVER(PARTITION BY [ConsLookUpID] ORDER BY [ConsLookUpID])=1
THEN
CASE
WHEN DATEPART(DAY,GETDATE())>15
THEN FORMAT(DATEADD(MONTH,0,GETDATE()),'yyyy-MM')
ELSE
FORMAT(DATEADD(MONTH,-1,GETDATE()),'yyyy-MM')
END
WHEN ROW_NUMBER()OVER(PARTITION BY [ConsLookUpID] ORDER BY [ConsLookUpID])=2
THEN
CASE
WHEN DATEPART(DAY,GETDATE())>15
THEN FORMAT(DATEADD(MONTH,-1,GETDATE()),'yyyy-MM')
ELSE
FORMAT(DATEADD(MONTH,-2,GETDATE()),'yyyy-MM')
END
WHEN ROW_NUMBER()OVER(PARTITION BY [ConsLookUpID] ORDER BY [ConsLookUpID])=3
THEN
CASE
WHEN DATEPART(DAY,GETDATE())>15
THEN FORMAT(DATEADD(MONTH,-2,GETDATE()),'yyyy-MM')
ELSE
FORMAT(DATEADD(MONTH,-3,GETDATE()),'yyyy-MM')
END
ELSE ''
END AS [Write-off-Month]
,[RevLookUpId]+'_'+[Write-off-Month] as [Write-off-Key]
FROM ABC
我想要的结果是使用Writ-off-Key列中的case语句结果作为Writ-off-Month的值。 我可以再次使用 case 语句,会给我答案,但我不想这样做,因为它会增加处理时间。
尝试在不同的查询中执行 case 语句计算,然后使用 conslookUpId 进行内部连接,但 conslookupId 正在重复,因此即使我使用了内部连接,它也正在执行交叉连接。
在我看来,在同一个查询中可能无法实现,但会有某种方法,但无法弄清楚。如果可能的话,我也想只使用单个查询。
SQL 有时很奇怪,会让你重复自己的话。但是,在这种情况下,您可以通过嵌套代码(或将其拉出到 CTE)来显着改进。请注意,无论如何您都必须执行此操作才能使窗口功能按您的预期工作:
WITH PreCompute As (
SELECT RevLookUpId
, ROW_NUMBER()OVER(PARTITION BY [ConsLookUpID] ORDER BY [ConsLookUpID]) as [Write-off-Count]
, CASE WHEN DATEPART(DAY, GETDATE()) > 15 THEN 1 ELSE 0 END As DayOffset
FROM ABC
)
SELECT
[Write-off-Count]
,CASE WHEN [Write-off-Count] BETWEEN 1 AND 3
THEN FORMAT(DATEADD(MONTH, DayOffset - [Write-off-Count], GETDATE()), 'yyyy-MM')
ELSE '' END As [Write-off-Month]
,[RevLookUpId]
+'_'
+CASE WHEN [Write-off-Count] BETWEEN 1 AND 3
THEN FORMAT(DATEADD(MONTH, DayOffset - [Write-off-Count], GETDATE()), 'yyyy-MM')
ELSE '' END as [Write-off-Key]
FROM PreCompute