SQL:仅查询具有相关匹配数据的两个时间段

时间:2013-12-23 04:34:27

标签: sql sql-server

请原谅这个问题的标题,但我想不出简单的方式询问下面。

简而言之,我现在有大约400家商店,我想要比较去年同期的交易。问题是,去年,一些商店不在附近或没有数据,反之亦然。我想写一个现在比较的查询,然后只在两个时间段内存储数据的地方。

考虑这些数据:

storeID   tranDate     qty  sale
A         2013-12-01     1   $10
B         2013-12-02     1   $10
C         2013-12-03     1   $10
D         2013-12-04     1   $10
A         2012-12-05     1   $10
A         2012-12-09     1   $10
D         2012-12-06     1   $10
E         2012-12-07     1   $10
F         2012-12-08     1   $10

要查询12月的数据,我会做类似的事情:

select * 
from myTable
where (tranDate between @DateStart and @DateEnd) or (tranDate between @DateStartPreviousYear and @DateEndPreviousYear)

但是,如果我想像12月一样查询12月(即商店A和D是现在和去年商店唯一的共同点),我该怎么做?

在我的现实世界中,我每月将在约400家商店进行约200万笔交易。

请帮忙!提前谢谢!

编辑:感谢您的答案到目前为止。我已经编辑了我的样本数据,以便在2012年12月包含商店A的两条记录 - 我是否正确地说这会导致加入StoreID时出现问题

3 个答案:

答案 0 :(得分:0)

为每个日期范围进行联接:

SELECT A.qty + B.qty AS [Qty],
   A.sale + B.sale AS [Sales],
   A.StoreID
FROM myTable  AS A
JOIN myTable AS B
  ON B.StoreId = A.StoreId
WHERE  A.trandate between @monthstart and @monthend
  AND  B.trandate between @MonthStartPrevious and @MonthEndPrevious 

答案 1 :(得分:0)

这样的事情可能会让你开始:

SELECT * 
FROM  MyTable
INNER JOIN MyTable
       AS PreviousYear
       ON PreviousYear.StoreID = MyTable.StoreID
       AND PreviousYear.tranDate Between @PreviousMonthSTart AND @PreviousMonthEnd
WHERE TranDate Between @MonthStart AND @MonthEnd

答案 2 :(得分:0)

正确阅读我的评论。我没有使用任何参数,因为我不清楚参数数据。 你必须提一下哪些样本数据不起作用。

Declare @Store table (storeID char(1),tranDate date,qty int, sale money)
insert into @Store values('A','2013-12-01',1,$10),('B','2013-12-02',1,   $10),('C','2013-12-03',1,$10),('D','2013-12-04',1,$10)
,('A','2012-12-05',1,$10),('D','2012-12-06',1,$10),('E','2012-12-07',1,$10),('F','2012-12-08',1,$10)

;with CTE as
(select *,ROW_NUMBER()over(partition by storeID order by tranDate)rn   from @Store)

select * from cte a
inner join cte b on a.storeID=b.storeID and( b.rn-a.rn)=1
and datediff(year,a.tranDate,b.tranDate)=1