如何使用一对多关系连接两个表

时间:2013-10-09 17:16:09

标签: sql sql-server

我正在使用MS SQL Server 2008。

我有两张桌子。

第一个包含两列datetime类型StartDate和EndDate以及ProductID(int)。

第二个表包含datetime列SaleDate和ProductID。

我想要完成的是创建一个包含的表 每个产品ID的ProductID,StartDate,EndDate和NUM​​BER OF SALES确保在结果表中仅包含startDate和EndDate之间发生的销售。

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

提前致谢!

3 个答案:

答案 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

以下是一些实际操作示例: