1

我正在为此绞尽脑汁,我认为它并没有我想象的那么具有挑战性。实际上,我想要做的是:

计算月平均销售额,同时排除适用于所有地区的假日类型 1(例如,我可以将其更改为特定地区的类型 2)。

SELECT Year(Date) AS Year, Month(Date) AS Month, Avg(tblSales.Sales) AS AvgSales
FROM tblSales
LEFT JOIN tblHolidays
ON tblSales.[Date] >= tblHolidays.[Date From] AND tblSales.[Date] <= tblHolidays.[Date To] 
WHERE tblHolidays.[Date From] Is Null AND tblHolidays.[Type]<> 1 AND tblHolidays.[Region]<>"All"
GROUP BY Year(Date), Month(Date);

现在我不确定我是否理解这是否有效,但它确实会产生结果。我没有看到的是它告诉 tblHolidays 与 tblSales.[Date] 相比时不要使用类型 2 和类型 3 假期或适用于特定地区的假期。

有任何想法吗?

4

1 回答 1

0

这真的是你的意思。

SELECT Year(Date) AS Year, Month(Date) AS Month, Avg(tblSales.Sales) AS AvgSales
FROM tblSales
LEFT JOIN tblHolidays
     ON tblSales.[Date] >= tblHolidays.[Date From]
        AND tblSales.[Date] <= tblHolidays.[Date To]
        AND tblHolidays.[Type] = 1 AND tblHolidays.[Region] = "All"
WHERE tblHolidays.[Date From] Is Null
GROUP BY Year(Date), Month(Date);

LEFT JOIN 用于从 tblHolidays 中引入匹配项,它在ON子句中的所有条件上匹配 tblSales。在这种情况下,它说:

  1. 查找涵盖销售日期的假日类型 1 并影响“所有”地区。

由于 LEFT JOIN 的性质,即使在 tblHolidays 中没有找到匹配项,它也会保留 tblSales 中的所有行。接下来,在找到匹配项的地方,我们使用过滤器将它们删除tblHolidays.[Date From] Is Null。因为tblHolidays.[Date From]在找到假期条件的地方为空。

于 2012-11-19T05:18:18.097 回答