多个表的SQL日期范围查询

时间:2018-03-12 18:29:09

标签: sql sql-server

我在创建SQL查询时遇到一些问题,要根据另一个表中的日期从一个表中提取数据...表A包含以下列:

CustomerID (ie. 1111)
romoCode (ie. CR-101)
StartDate (ie. 2018-01-05)
EndDate (ie. 2018-01-08)

表B包含以下列:

CustomerID (ie. 1111)
DateOfVisit (ie. 2018-01-06)
AmountSpent (ie. 50.00)

我想做的是弄清楚表A中每个客户在促销期间(StartDate和EndDate之间)花了多少钱。这里只是我尝试过的众多查询之一的一个例子,但我得到的结果并不正确...

select 
      a.CustomerID, a.PromoCode, sum(b.AmountSpent) as TotalSpent
from
    TableA as a
    left join
    TableB as b
    on 
    a.CustomerID = b.CustomerID
where
    b.DateOfVisit between a.StartDate and a.EndDate
group by
    a.PromoCode, a.CustomerID

似乎我通过此查询得到的一些结果是正确的,但只要我有重复的CustomerID(即同一个客户在不同日期兑换了不同的促销),它似乎只是将它们的总数合并。 我已经尝试了各种嵌套,分组和加入方法,没有运气,所以任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:0)

这似乎既是数据又是查询问题。按照目前的情况,您的样本数据显示您不能停止重复,除非其他地方的促销代码从不会重复单个客户的日期重复。要解决此问题,您需要向表B添加促销代码,然后在客户ID和日期之外使用该代码加入。事实上,如果促销代码不能按客户重复,那么您可以在将促销代码添加到表B后从查询中删除日期。

如果它有帮助,那么当前查询将会发生什么。

表A

CustomerID, PromoCode, StartDate, EndDate
1111, CR-101, 2018-01-05, 2018-01-09
1111, CR-121, 2018-01-07, 2018-01-11

表B

CustomerID, DateOfVisit, AmountSpent
1111, 2018-01-06, 50.00
1111, 2018-01-08, 75.00

对于这些数据,我说6号实际上来自CR-101,第8号来自CR-121。但是,查询结果将是:

CustomerID, PromoCode, TotalSpent
1111, CR-101, 125.00
1111, CR-121, 75.00

如果您注意到,由于日期访问位于客户每个促销代码的日期范围内,因此CR-101会显示125而不是50,因为查询会匹配。