我正在使用MS SQL Server 2008。
我有两张桌子。
第一个包含两列datetime类型StartDate和EndDate以及ProductID(int)。
第二个表包含datetime列SaleDate和ProductID。
我想要完成的是创建一个包含的表 每个产品ID的ProductID,StartDate,EndDate和NUMBER OF SALES确保在结果表中仅包含startDate和EndDate之间发生的销售。
在尝试与第一个表连接之前,我从第二个表中提取数据,并按ProductID对其进行分组。
提前致谢!
答案 0 :(得分: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
答案 1 :(得分: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;
答案 2 :(得分: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
以下是一些实际操作示例:
JOIN
:http://sqlfiddle.com/#!3/0b408/2 VIEW
:http://sqlfiddle.com/#!3/0758b