SQL Server 中的条件联合,直到到达特定日期
Posted
技术标签:
【中文标题】SQL Server 中的条件联合,直到到达特定日期【英文标题】:Conditional union in SQL Server until it reaches a specific date 【发布时间】:2016-10-29 12:51:08 【问题描述】:我有一张表格,日期从前一年的第一天到上个月,即 2015 年 1 月到 2016 年 9 月。
我必须在下面的同一张表中进行两个月的比较 i。 e.,从table1
中选择一月份的所有行,除了表1中二月份的行;从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
样本数据:
Customer Product date amount
-------------------------------------------
a p1 1/31/2015 $12
a p2 1/31/2015 $13
a p2 2/28/2015 $1
所以这里的产品 p1 存在于 1 月,而 2015 年 2 月不再存在。所以我需要 2015 年 2 月不存在的所有 1 月产品 ....
谁能提出解决方案?
【问题讨论】:
请编辑您的问题并提供示例数据和所需的结果。 这是有道理的。您真正想在商业上实现什么目标? 一些数据清理 col1,col2 可以在请求的结果集中重复吗?例如,如果一个组合存在于一月,它是否也存在于五月?另外,它可以在一月份存在两次吗?我们要消除所有重复项吗? 不,每个产品和客户只有一个组合存在一个月。 【参考方案1】:首先,您似乎将所有数据都放在一个表中。在这种情况下,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;
当然,您还没有展示 data 的实际样子,所以我不知道 t.month + 1
真正应该是什么样子。但想法是在“月”值上加一个月。
【讨论】:
添加了示例数据。能否请您指教。 @bipro 。 . .这个答案几乎可以满足您的要求。您只需修复日期算术以匹配您的数据。【参考方案2】:请检查一下。
这些都是好东西
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())
)
;
【讨论】:
以上是关于SQL Server 中的条件联合,直到到达特定日期的主要内容,如果未能解决你的问题,请参考以下文章