我有两张桌子,
表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
答案 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的总和。然后加入另一张桌子。
您的结果将是按ID
,product
和date
分组的数量。
答案 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
未经测试......如果有人发现问题,请随时编辑!