在选择查询中重用Case语句计算

问题描述 投票:0回答:1
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 sql-server case inner-join
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.