繁体   English   中英

SQL SERVER如何联接2个表

[英]SQL SERVER How To join 2 tables

我有2张桌子

表1股票卡

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的最后日期2015年10月1日之前计算总数量

谢谢

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

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

对于大多数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子句中的原因。

这应该可以解决问题

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

这是做什么的...选择请求的列,并加上数量。 然后加入另一个表。 您的结果将是按IDproductdate分组的数量。

试试这个,行吗? 我不得不根据我们在数据结构上掌握的很少信息做出一些假设。 更改INNOT 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM