[英]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
这是做什么的...选择请求的列,并加上数量。 然后加入另一个表。 您的结果将是按ID
, product
和date
分组的数量。
试试这个,行吗? 我不得不根据我们在数据结构上掌握的很少信息做出一些假设。 更改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
未经测试...因此,如果有人发现问题,请随时进行编辑!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.