mssql使用相同的表连接条件

时间:2016-01-27 21:24:59

标签: sql-server join

需要一点帮助。所以我在这里有这个日历表sqlfiddle.com/#!3/5d8a9有2个标志(M,W)表示月或周。我需要与具有每周日期字段的TBL2(下方)进行联接。所以我将在开始日期与Cal表的周开始时加入TBL2(带有W标志)但是如果weekstartdate在开始和结束日期之间,我需要返回带有'M'标志的startdate。它有意义吗?

TBL2:

prod_id        weeknum      wkstartdate     postingDate     qty
----------------------------------------------------------------
1043890         5           2015-01-25      2016-01-18      3
1043890         6           2015-02-01      2016-01-18      6
1043890         7           2015-02-08      2016-01-18      2
1043890         8           2015-02-15      2016-01-18      0
...
1043890         50          2015-12-06      2016-01-18      1
1043890         51          2015-12-13      2016-01-18      2
1043890         52          2015-12-20      2016-01-18      7


Desired Result:
==================

prod_id       weeknum      wkstartdate     postingDate     qty   Period
----------------------------------------------------------------------------
1043890         5           2015-01-25      2016-01-18      3    2015-01-25
1043890         6           2015-02-01      2016-01-18      6    2015-01-25
1043890         7           2015-02-08      2016-01-18      2    2015-01-25
1043890         8           2015-02-15      2016-01-18      0    2015-01-25
1043890         10          2015-03-01      2016-01-18      0    2015-03-01
...
1043890         50          2015-12-06      2016-01-18      1    2015-11-22
1043890         51          2015-12-13      2016-01-18      2    2015-11-22
1043890         52          2015-12-20      2016-01-18      7    2015-11-22

如果有意义,我正在尝试检查weekstartdate是否介于一个日期范围(startdate-enddate)和M标志之间,然后启动startdate并在temp表中更新该记录或创建一个temp将新列添加到每条记录中的表。

感谢。

1 个答案:

答案 0 :(得分:1)

我的理解是你试图在startstate上使用cal表连接tablestarttable上的table2,如果周开始日期在开始日期和结束日期之间,你想修改标志。 如果纠正,请尝试以下查询。

select t2.prod_id,t2.weeknum,c.startdate
       ,case when t2.wkstartdate between c.startdate and c.enddate
        then 'M' else null end modifiedflag, 
        c.flag as originalflag 
from   cal c,table2 t2 
where  c.flag ='W' and t2.wkstartdate = c.startdate
       and t2.wkstartdate between c.startdate and c.enddate;