CASE WHEN和DATEADD选择不同的列。

问题描述 投票:1回答:1

我试图选择一些值,如果某个日期是在周末的某一天,那么它就会选择前一天或多天,我让它工作。现在我想让它在另一列中选择一个值,因为我想显示日历维度中的CalendarID。

我的工作代码如下。

SELECT 
i.Item
,CASE
    WHEN c.DayOfWeek = 6 THEN DATEADD(day,-1,c.Date) 
    WHEN c.DayOfWeek = 7 THEN DATEADD(day,-2,c.Date) 
    ELSE c.Date END AS TransactionDate

FROM [dbo].[Items] i
LEFT JOIN [dbo].[Dim_Calendar] c ON 
c.Date = q.TransactionDate

我试过下面的代码 但我的 "等号 "似乎出错了。

SELECT 
i.Item
,CASE c.CalendarID
    WHEN c.DayOfWeek = 6 THEN DATEADD(day,-1,c.Date) 
    WHEN c.DayOfWeek = 7 THEN DATEADD(day,-2,c.Date) 
    ELSE c.Date END AS TransactionDate

FROM [dbo].[Items] i
LEFT JOIN [dbo].[Dim_Calendar] c ON 
c.Date = q.TransactionDate

我以为我可以在这些特定的值上得到CalendarID的值。有没有一种方法可以实现我的要求,解决方法也许是在左联接语句中做CASE WHEN?

sql-server calendar case-when dateadd
1个回答
1
投票

你并不完全清楚你想做什么。

你在SELECT子句中给出的别名不能用于查询的其他部分。

你可以这样说

LEFT JOIN dbo.Dim_Calendar c 
           ON c.date = CASE 
                       WHEN c.DayOfWeek = 6 THEN DATEADD(day,-1,c.Date) 
                       WHEN c.DayOfWeek = 7 THEN DATEADD(day,-2,c.Date) 
                       ELSE c.Date END

查询规划器很聪明,可以正确地优化这一点,所以它只是啰嗦,而不是缓慢。

或者你可以像这样嵌套你的查询,让你的别名可见。

SELECT i.Item, i.TransactionDate
  FROM (SELECT 
              i.Item
             ,CASE c.CalendarID
              WHEN c.DayOfWeek = 6 THEN DATEADD(day,-1,c.Date) 
              WHEN c.DayOfWeek = 7 THEN DATEADD(day,-2,c.Date) 
              ELSE c.Date END AS TransactionDate
          FROM [dbo].[Items]
        ) i
  LEFT JOIN [dbo].[Dim_Calendar] c ON c.Date = i.TransactionDate

但是 这些都不能调试. 我不确定 ON 条件在你的左边加入。

© www.soinside.com 2019 - 2024. All rights reserved.