2013-12-23 34 views
0

请原谅这个问题的标题,但我想不出简洁的方式来问下面的问题。SQL:查询只有相关匹配数据的两个时间段

简而言之,我有大约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 

要查询月数据,我会做这样的事情:

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

但是,如果我想查询十二月像对等的(即存储和D是现在和去年唯一的商店),我该怎么做?

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

请帮忙!提前致谢!

编辑:感谢您的答案到目前为止。我已经编辑我的样本数据,包括2012年12月两个记录的商店A - 我是说得很对,这将导致一个问题,加入了关于STOREID

+0

在你的例子中,你是否想要一个商店a和d的所有交易清单? – Greg

+0

我误解了你的问题,我纠正了我的回应。 –

+0

非常清楚,去年是什么,你将通过什么样的参数(样本)。年份的平均值是2013年12月和2012年1月的数据是正确的。如果数据是连续的年份,你可以比较一下。如从2010年到2013年。 所以往年意味着什么在f年和确切的月份.doi说datediff应该是1年? – KumarHarsh

回答

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 
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 
0

读我的评论properly.i我不使用任何参数作为参数的数据我不太清楚。 你必须提及哪些样本数据不起作用。

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 
相关问题