SQL SERVER如何连接2个表

时间:2016-03-11 16:03:42

标签: sql join

我有两张桌子,

表1 StockCard

OutletKey   ProductKey  Date          qty
101         ABC         01/01/2014    10
101         ABC         21/02/2014    5
101         ABC         31/03/2014    5
101         ABC         05/06/2014    2
101         ABC         20/10/2014    3
101         ABC         11/11/2014    4
101         ABC         12/12/2014    7
101         ABC         05/01/2015    8
101         ABC         03/02/2015    10

第二个表是stock_date

OutletKey    StockDate
101          05/04/2014
101          14/10/2014
101          10/01/2015

我想要这样的结果

OutletKey    ProductKey   StockDate   TotalQty
101          ABC          10/01/2015  44

所以我需要在stockdate的最后日期之前计算总数量,即10/01/2015

由于

编辑:我正在写这样的查询,但结果不正确。

Select SC.outletkey ,SC.productkey ,SD.StockDate ,Sum(SC.qty) as totalqty
From StockCard SC 
Inner Join StockDate SD 
On SC.outletkey = SD.outletkey and SC.date < SD.stockdate 
Group by SC.outletkey ,SC.productkey ,SD.StockDate

3 个答案:

答案 0 :(得分:1)

对于大多数RDBMS,我会这样做:

SELECT sc.OutletKey
    ,sc.ProductKey
    ,sd.LastStockDate AS StockDate
    ,SUM(sc.qty) AS TotalQty
FROM StockCard sc
INNER JOIN (
        SELECT OutletKey
            ,MAX(StockDate) AS LastStockDate
        FROM stock_date
        GROUP BY OutletKey
    ) sd
    ON  sd.OutletKey = sc.OutletKey
    AND sc.Date      < sd.LastStockDate
GROUP BY sc.OutletKey
    ,sc.ProductKey
    ,sd.LastStockDate

对于SQL Server,我将INNER JOIN转换为CROSS APPLY,这可能会有更好的表现:

SELECT sc.OutletKey
    ,sc.ProductKey
    ,sd.LastStockDate AS StockDate
    ,SUM(sc.qty) AS TotalQty
FROM StockCard sc
CROSS APPLY (
        SELECT MAX(StockDate) AS LastStockDate
        FROM stock_date
        WHERE OutletKey = sc.OutletKey
    ) sd
WHERE sc.Date < sd.LastStockDate
GROUP BY sc.OutletKey
    ,sc.ProductKey
    ,sd.LastStockDate

我认为不可能将不平等转移到相关性,这就是它在WHERE子句中的原因。

答案 1 :(得分:0)

这应该可以解决问题

Select StockCard.OutletKey, StockCard.ProductKey, stock_date.StockDate, sum(StockCard.TotalQty) as TotalQty 
from StockCard
inner join stock_date on StockCard.OutletKey = stock_date.OutletKey
group by StockCard.OutletKey, StockCard.ProductKey, stock_date.StockDate

这是做什么的...... 选择请求的列,并使用quatity的总和。然后加入另一张桌子。 您的结果将是按IDproductdate分组的数量。

答案 2 :(得分:0)

试试这个,工作正常吗?我不得不根据我们对数据结构的一些信息做出一些假设。如果您希望在该日期之前的所有内容而不是该日期,请将IN更改为NOT IN

如果反馈不符合您的要求,欢迎提供反馈。

SELECT sd.OutletKey, sd.ProductKey, sd.StockDate, SUM(sc.qty) AS TotalQty
FROM stock_date sd
INNER JOIN StockCard sc ON sd.OutletKey = sc.OutletKey
   AND sd.ProductKey= sc.ProductKey
   AND sd.StockDate= sc.StockDate
WHERE sd.StockDate IN (
   SELECT MAX(StockDate) FROM stock_date
)
GROUP BY sd.OutletKey, sd.ProductKey, sd.StockDate

未经测试......如果有人发现问题,请随时编辑!