[英]SQL SERVER How To join 2 tables
I have 2 tables, 我有2张桌子
Table 1 StockCard 表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
And the second table is stock_date 第二个表是stock_date
OutletKey StockDate
101 05/04/2014
101 14/10/2014
101 10/01/2015
And I want the result like this 我想要这样的结果
OutletKey ProductKey StockDate TotalQty
101 ABC 10/01/2015 44
So I need to calculate total qty before last date of stockdate which is 10/01/2015 所以我需要在stockdate的最后日期2015年10月1日之前计算总数量
Thanks 谢谢
EDIT: I am writing query like this but the result is not correct. 编辑:我正在写这样的查询,但结果不正确。
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
For most RDBMSs, I would do it like this: 对于大多数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
For SQL Server, I'd convert the INNER JOIN
to a CROSS APPLY
, which might perform better: 对于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
I don't think it's possible to move the inequality to the correlation, so that's why it's in the WHERE clause. 我认为将不等式移至相关性是不可能的,因此这就是WHERE子句中的原因。
This should do the trick 这应该可以解决问题
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
What this does... Selects the requested columns, with a sum of the quatity. 这是做什么的...选择请求的列,并加上数量。 Then joins the other table up.
然后加入另一个表。 Your result will be the quantities grouped by
ID
, product
, and date
. 您的结果将是按
ID
, product
和date
分组的数量。
Try this, work OK? 试试这个,行吗? I had to make some assumptions based on what little info we have on the data structure.
我不得不根据我们在数据结构上掌握的很少信息做出一些假设。 Change the
IN
into a NOT IN
if you want everything before that date rather than on that date. 更改
IN
成NOT IN
,如果你在该日期之前,而不是在那一天想要的一切。
Feedback is welcome if it doesn't quite fit what you want. 如果反馈与您的要求不符,欢迎您提供反馈。
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
Not tested... so if anyone sees a problem, feel free to edit! 未经测试...因此,如果有人发现问题,请随时进行编辑!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.