1

我正在使用 MS SQL Server 2008。

我有两张桌子。

第一个包含两列日期时间类型的 StartDate 和 EndDate 以及 ProductID (int)。

第二个表包含日期时间列 SaleDate 和 ProductID。

我想要完成的是创建一个表,该表将包含每个产品 ID 的 ProductID、StartDate、EndDate 和 NUMBER OF SALES,确保只有在 startDate 和 EndDate 之间发生的销售包含在结果表中。

在尝试与第一个表连接之前,我从第二个表中提取数据,按 ProductID 对其进行分组。

提前致谢!

4

3 回答 3

1

我没有机会尝试这个,但它应该可以工作。

select f.ProductID, f.StartDate, f.EndDate, count(*) as Sales
from firstTable f
inner join secondTable s on s.ProductID = f.ProductID
where s.SaleDate between f.StartDate and f.EndDate
group by f.ProductID, f.StartDate, f.EndDate
于 2013-10-09T17:21:24.830 回答
0

获取所需信息的实际查询本身非常简单:

-- NOTE: if you want to exclude product records for which there
-- are no sales, use an INNER JOIN instead
SELECT p.ProductID, p.StartDate, p.EndDate, COUNT(*) [NumSales]
FROM Products p
LEFT JOIN Sales s 
    ON s.ProductID = p.ProductID
WHERE s.SaleDate BETWEEN p.StartDate AND p.EndDate
GROUP BY p.ProductID, p.StartDate, p.EndDate

但是,我建议不要根据这些信息制作单独的表格,因为它需要不断更新。相反,如果这是一个您认为会经常运行的查询,那么我建议将其转换为VIEW

CREATE VIEW CountSalesView AS
    SELECT p.ProductID, p.StartDate, p.EndDate, COUNT(*) [NumSales]
    FROM Products p
    LEFT JOIN Sales s
        ON s.ProductID = p.ProductID
    WHERE s.SaleDate BETWEEN p.StartDate AND p.EndDate
    GROUP BY p.ProductID, p.StartDate, p.EndDate

从那里,您可以在需要最新信息的任何时候像查询表格一样查询它:

SELECT * 
FROM CountSalesView

以下是一些实际的例子:

于 2013-10-09T17:39:09.010 回答
0

很基本:

SELECT    a.ProductID, a.StartDate, a.EndDate, COUNT(*) AS Sales
FROM      TAB1 a
LEFT JOIN TAB2 b
ON        a.ProductID = b.ProductID
          AND b.SaleDate >= a.StartDate
          AND b.SaleDate <= a.EndDate
GROUP BY  a.ProductID, a.StartDate, a.EndDate;
于 2013-10-09T17:24:10.943 回答