SQL Server中的条件联合,直到达到特定日期

时间:2016-10-29 12:51:09

标签: sql sql-server tsql sql-server-2012

我有一张表格,上一年的第一年至上个月,即2015年1月至2016年9月。

我必须在下表i中进行两个月的比较。例如,从{1}中选择1月份的所有行,除了表1中2月份的行;从table1 .....

中选择2月份的所有行,除了3月份的行

直到上个月才到达。

在这里,我需要每两个月进行一次有条件的联合比较直到上个月。

样品:

table1

示例数据:

select col1,col2 from table1 where month=jan 2015 
except 
select col1,col2 from table1 where month=feb 2015
union
select col1,col2 from table1 where month=feb 2015 
except 
select col1,col2 from table1 where month=mar 2015
.
.
.
union
select col1,col2 from table1 where month=aug 2016 
except 
select col1,col2 from table1 where month=sep 2016

所以这里的产品p1存在于jan而不再存在于2015年2月。所以我需要Jan的所有产品在2015年2月不存在....

有人可以建议解决方案吗?

2 个答案:

答案 0 :(得分:0)

首先,您似乎将所有数据都放在一个表中。在这种情况下,通常不需要union all(及相关操作)。

其次,您似乎想要一个月但不是下个月的行。

我会这样想:

select t.*
from table1 t
where not exists (select 1
                  from table1 t2
                  where t2.col1 = t.col1 and t2.col2 = t.col2 and
                        t2.month = t.month + 1
                 ) and
      month >= jan 2015 and
      month <= sep 2016;

当然,您还没有显示数据实际上是什么样子,所以我不知道t.month + 1究竟应该是什么样子。但这个想法是在'&#34;月&#34;添加一个月。值。

答案 1 :(得分:0)

请检查一下。

这些是好的

select      *

from       (select      t.*
                       ,max (sale_month) over (partition by customer_id,product_id,sale_year)  as last_sale_month_of_year

            from        t
            ) t

where       t.last_sale_month_of_year in (1,12) -- Jan,Dec
        or  (    sale_year                  = year(getdate())
             and last_sale_month_of_year    = moth(getdate()) 
            )
;

这些是坏的

select      *

from       (select      t.*
                       ,max (sale_month) over (partition by customer_id,product_id,sale_year)  as last_sale_month_of_year

            from        t
            ) t

where       t.last_sale_month_of_year not in (1,12) -- Jan,Dec
        and  (   sale_year                  <> year(getdate())
             or  last_sale_month_of_year    <> moth(getdate()) 
            )
;