简体   繁体   English

SQL SERVER如何联接2个表

[英]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 . 您的结果将是按IDproductdate分组的数量。

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. 更改INNOT 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.

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