MySQL内部联接并在所有行上按日期用最新值替换值

时间:2019-03-08 20:41:26

标签: mysql

我一直在寻找并尝试搜索,但是没有运气。我将继续这样做,但是希望获得一些帮助或指出正确的方向!

我有2个数据表(与下面类似)


sales_quotes

myIDX inStock   QDate   MFGname  MFGNumber  Vendor
+-----+-----+----------+--------+--------+----------+
|  1  | 20  | 3/4/2018 | Burton | snow1  | Christie |
+-----+-----+----------+--------+--------+----------+
|  2  | 100 | 3/8/2018 | Burton | snow1  | Christie |
+-----+-----+----------+--------+--------+----------+
|  3  | 35  | 3/8/2018 | Jones  | proto1 | Christie |
+-----+-----+----------+--------+--------+----------+
|  4  | 45  | 3/4/2018 | Jones  | proto1 | Christie |
+-----+-----+----------+--------+--------+----------+

sales_quotes_prices

 myIDX  myQTY myPrice
+-----+------+-------+
|  1  |  20  |  250  |
+-----+------+-------+
|  1  |  50  |  225  |
+-----+------+-------+
|  2  |  20  |  250  |
+-----+------+-------+
|  2  |  50  |  225  |
+-----+------+-------+
|  3  |  20  |  350  |
+-----+------+-------+
|  4  |  10  |  300  |
+-----+------+-------+
|  4  |  50  |  250  |
+-----+------+-------+

我已经能够使用内部联接将sales_quotes分解为多行,并包含每个行可用的数量和价格。

SELECT q.myIDX
     , q.MFG
     , q.MFGN
     , q.Vendor
     , q.QDate
     , q.InStock
     , p.myQTY
     , p.myPrice
  FROM sales_quotes_prices p
  JOIN sales_quotes q
    ON p.myIDX = q.myIDX

加入结果低于

+-------+---------+----------+---------+-----------+----------+-------+---------+
| myIDX | inStock | Qdate    | MFGname | MFGNumber | Vendor   | myQTY | myPrice |
+-------+---------+----------+---------+-----------+----------+-------+---------+
| 1     | 20      | 3/4/2018 | Burton  | snow1     | Christie | 20    | 250     |
+-------+---------+----------+---------+-----------+----------+-------+---------+
| 1     | 20      | 3/4/2018 | Burton  | snow1     | Christie | 50    | 225     |
+-------+---------+----------+---------+-----------+----------+-------+---------+
| 2     | 100     | 3/8/2018 | Burton  | snow1     | Christie | 20    | 250     |
+-------+---------+----------+---------+-----------+----------+-------+---------+
| 2     | 100     | 3/8/2018 | Burton  | snow1     | Christie | 50    | 225     |
+-------+---------+----------+---------+-----------+----------+-------+---------+
| 3     | 35      | 3/8/2018 | Jones   | proto1    | Christie | 20    | 350     |
+-------+---------+----------+---------+-----------+----------+-------+---------+
| 4     | 45      | 3/4/2018 | Jones   | proto1    | Christie | 10    | 300     |
+-------+---------+----------+---------+-----------+----------+-------+---------+
| 4     | 45      | 3/4/2018 | Jones   | proto1    | Christie | 50    | 250     |
+-------+---------+----------+---------+-----------+----------+-------+---------+

目标:我正在尝试用相同的[mfgname,mfgnumber,供应商]替换所有匹配报价中最新“ QDate”中的“库存”十进制值

但是我仍然坚持如何实现这一目标(下面已适当分配了“库存”!)

+-------+---------+----------+---------+-----------+----------+-------+---------+
| myIDX | inStock | Qdate    | MFGname | MFGNumber | Vendor   | myQTY | myPrice |
+-------+---------+----------+---------+-----------+----------+-------+---------+
| 1     | 100     | 3/4/2018 | Burton  | snow1     | Christie | 20    | 250     |
+-------+---------+----------+---------+-----------+----------+-------+---------+
| 1     | 100     | 3/4/2018 | Burton  | snow1     | Christie | 50    | 225     |
+-------+---------+----------+---------+-----------+----------+-------+---------+
| 2     | 100     | 3/8/2018 | Burton  | snow1     | Christie | 20    | 250     |
+-------+---------+----------+---------+-----------+----------+-------+---------+
| 2     | 100     | 3/8/2018 | Burton  | snow1     | Christie | 50    | 225     |
+-------+---------+----------+---------+-----------+----------+-------+---------+
| 3     | 35      | 3/8/2018 | Jones   | proto1    | Christie | 20    | 350     |
+-------+---------+----------+---------+-----------+----------+-------+---------+
| 4     | 35      | 3/4/2018 | Jones   | proto1    | Christie | 10    | 300     |
+-------+---------+----------+---------+-----------+----------+-------+---------+
| 4     | 35      | 3/4/2018 | Jones   | proto1    | Christie | 50    | 250     |
+-------+---------+----------+---------+-----------+----------+-------+---------+

感谢您的建议!

2 个答案:

答案 0 :(得分:0)

这不是很好,但是:

SELECT q.myIDX
     , B.InStock/*Instock data coming from subquery*/
     , q.QDate   
     , q.MFGname
     , q.MFGNumber
     , q.Vendor
     , p.myQTY
     , p.myPrice
  FROM sales_quotes_prices p
  JOIN sales_quotes q
    ON p.myIDX = q.myIDX
/*the subquery starts here*/        
LEFT JOIN
(SELECT a.myidx,a.instock,a.qdate,a.mfgname,a.mfgnumber,a.vendor FROM sales_quotes A INNER JOIN 
(SELECT *,MAX(qdate) AS latestdate FROM sales_quotes GROUP BY mfgname, mfgnumber, vendor) LATEST
ON a.qdate=latest.latestdate AND a.mfgname=latest.mfgname AND a.mfgnumber=latest.mfgnumber AND a.vendor=latest.vendor) B
ON q.mfgname=B.mfgname AND q.mfgnumber=B.mfgnumber AND q.vendor=b.vendor;

我正在使用子查询来自定义“ InStock”列,仅显示最新数据。因此,第一个子查询(位于另一个子查询中)是:

SELECT *,MAX(qdate) AS latestdate FROM sales_quotes GROUP BY mfgname, mfgnumber, vendor

MAX(qdate)将根据您的制造商名称,制造商编号,供应商(我定义为“最新日期”)的条件返回最新的日期组。然后,我用INNER JOIN上的第一个子查询向qdate=latestdate sales_qoutes表中写另一个查询,您可以在这里看到它:

SELECT a.myidx,a.instock,a.qdate,a.mfgname,a.mfgnumber,a.vendor FROM sales_quotes A INNER JOIN (SELECT *,MAX(qdate) AS latestdate FROM sales_quotes GROUP BY mfgname, mfgnumber, vendor) LATEST ON a.qdate=latest.latestdate AND a.mfgname=latest.mfgname AND a.mfgnumber=latest.mfgnumber AND a.vendor=latest.vendor

当然,我需要声明mfgname,mfgnumber和供应商也必须匹配。这将强制第二个子查询仅返回第一个子查询中与MAX(qdate)匹配的最新数据。最后一个只是通过将q.instock更改为b.instock(或您为子查询定义的任何派生表名称)并将其LEFT JOIN更改为子查询来编辑原始语法。 / p>

答案 1 :(得分:0)

要获得更优雅的实现,可以检查CTE和窗口功能: http://www.mysqltutorial.org/mysql-window-functions/ 这是一个跨数据库的示例: https://stackoverflow.com/a/3800572/1710180 该问题称为“按组选择第一行”