我试图选择一些值,如果某个日期是在周末的某一天,那么它就会选择前一天或多天,我让它工作。现在我想让它在另一列中选择一个值,因为我想显示日历维度中的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?
你并不完全清楚你想做什么。
你在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
条件在你的左边加入。