简体   繁体   中英

MySQL select last input date and value from same row different column

Basically trying to get Last ReceiptDate and QuantityPurchased from each ItemCode but no success. Below is what I have from table

+----------+-------------+-------------------+
| ItemCode | ReceiptDate | QuantityPurchased |
+----------+-------------+-------------------+
| 107082   | 2018-10-15  |              1200 |
| 107082   | 2018-07-11  |               360 |
| 107082   | 2018-06-18  |              2760 |
| 107082   | 2018-05-30  |              1200 |
| 05505501 | 2018-05-11  |               576 |
| 107082   | 2018-05-11  |              1056 |
| 05505501 | 2018-04-20  |               600 |
| 107082   | 2018-04-20  |               600 |
| 05505501 | 2018-04-06  |               384 |
| 107082   | 2018-04-06  |               600 |
| 05505501 | 2018-02-19  |              1200 |
| 05505501 | 2018-02-06  |              1200 |
| 107082   | 2018-02-06  |               600 |
| 05505501 | 2018-02-02  |               600 |
| 107082   | 2018-02-02  |               600 |
| 05505501 | 2018-01-12  |              1200 |
+----------+-------------+-------------------+

And this is the result I would like

+----------+-------------------------------+-------------+------------+---------------------+---------------+-----------------+------------------+-------------------+
| ItemCode | ItemCodeDesc                  | LastDatePur | LastQtyPur | TotalQuantityOnHand | Qty_0_90_Days | Qty_91_180_Days | Qty_181_270_Days | Qty_Over_270_Days |
+----------+-------------------------------+-------------+------------+---------------------+---------------+-----------------+------------------+-------------------+
| 05505501 | MDSBS-1-0 FANTA SALAD BWL CLR | 2018-05-11  |        576 |                3870 |             0 |               0 |              576 |                 0 |
| 107082   | MECRTL-6-00-6pc Round Acrylic | 2018-10-15  |       1200 |                3038 |          1200 |               0 |                0 |                 0 |
+----------+-------------------------------+-------------+------------+---------------------+---------------+-----------------+------------------+-------------------+

And what I have tried

SELECT DISTINCT ph.ItemCode, ph.ItemCodeDesc, MD.LastDatePur, MQ.LastQtyPur,
        i.TotalQuantityOnHand, 

        (CASE WHEN DATEDIFF(CURDATE(), MD.LastDatePur) BETWEEN 0 AND 90 THEN MQ.LastQtyPur ELSE 0 END) AS Qty_0_90_Days,
        (CASE WHEN DATEDIFF(CURDATE(), MD.LastDatePur) BETWEEN 91 AND 180 THEN MQ.LastQtyPur ELSE 0 END) AS Qty_91_180_Days,
        (CASE WHEN DATEDIFF(CURDATE(), MD.LastDatePur) BETWEEN 181 AND 270 THEN MQ.LastQtyPur ELSE 0 END) AS Qty_181_270_Days,
        (CASE WHEN DATEDIFF(CURDATE(), MD.LastDatePur) > 270 THEN MQ.LastQtyPur ELSE 0 END) AS Qty_Over_270_Days

FROM po_purchaseshistory ph, ci_item i, 
(SELECT ph.ItemCode, MAX(ph.ReceiptDate) AS LastDatePur FROM po_purchaseshistory ph WHERE ph.QuantityPurchased != 0 GROUP BY ph.ItemCode) AS MD,
(SELECT ph.ItemCode, ph.QuantityPurchased AS LastQtyPur FROM po_purchaseshistory ph WHERE ph.QuantityPurchased != 0 ORDER BY ph.ReceiptDate DESC LIMIT 1) AS MQ

WHERE ph.ItemCode = i.ItemCode
AND ph.ItemCode = MD.ItemCode
AND ph.ItemCode = MQ.ItemCode
AND ph.ItemCode IN (107082, 05505501)

I know line below is where the problem is. Tried sub query and group but they all end up with errors. Any help will be greatly appreciated.

(SELECT ph.ItemCode, ph.QuantityPurchased AS LastQtyPur FROM po_purchaseshistory ph WHERE ph.QuantityPurchased != 0 ORDER BY ph.ReceiptDate DESC LIMIT 1) AS MQ

Try out below:

SELECT P.* FROM 
(
SELECT ItemCode,MAX(ReceiptDate) AS LastDate FROM po_purchaseshistory GROUP BY ItemCode
)A,po_purchaseshistory P WHERE P.ItemCode = A.ItemCode AND A.LastDate = P.ReceiptDate

And the code that works..

SELECT DISTINCT ph.ItemCode, ph.ItemCodeDesc, MD.LastDatePur, MQ.LastQtyPur,
        i.TotalQuantityOnHand, 

        (CASE WHEN DATEDIFF(CURDATE(), MD.LastDatePur) BETWEEN 0 AND 90 THEN MQ.LastQtyPur ELSE 0 END) AS Qty_0_90_Days,
        (CASE WHEN DATEDIFF(CURDATE(), MD.LastDatePur) BETWEEN 91 AND 180 THEN MQ.LastQtyPur ELSE 0 END) AS Qty_91_180_Days,
        (CASE WHEN DATEDIFF(CURDATE(), MD.LastDatePur) BETWEEN 181 AND 270 THEN MQ.LastQtyPur ELSE 0 END) AS Qty_181_270_Days,
        (CASE WHEN DATEDIFF(CURDATE(), MD.LastDatePur) > 270 THEN MQ.LastQtyPur ELSE 0 END) AS Qty_Over_270_Days

FROM po_purchaseshistory ph 
LEFT JOIN ci_item i ON ph.ItemCode = i.ItemCode
LEFT JOIN (SELECT ph.ItemCode, MAX(ph.ReceiptDate) AS LastDatePur FROM po_purchaseshistory ph WHERE ph.QuantityPurchased != 0 GROUP BY ph.ItemCode) AS MD ON ph.ItemCode = MD.ItemCode
LEFT JOIN (SELECT ph.ItemCode, ph.ReceiptDate, ph.QuantityPurchased AS LastQtyPur FROM po_purchaseshistory ph WHERE ph.QuantityPurchased != 0) AS MQ ON ph.ItemCode = MQ.ItemCode

WHERE ph.ItemCode IN (107082, 05505501)
AND ph.ReceiptDate = MD.LastDatePur
AND ph.ReceiptDate = MQ.ReceiptDate

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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