我一直在寻找并尝试搜索,但是没有运气。我将继续这样做,但是希望获得一些帮助或指出正确的方向!
我有2个数据表(与下面类似)
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 |
+-----+-----+----------+--------+--------+----------+
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 |
+-------+---------+----------+---------+-----------+----------+-------+---------+
感谢您的建议!
答案 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 该问题称为“按组选择第一行”