请原谅这个问题的标题,但我想不出简单的方式询问下面。
简而言之,我现在有大约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时出现问题
答案 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