Mysql 如何获得过期和未过期的数量?

Mysql 如何获得过期和未过期的数量?,mysql,Mysql,我把过期药品的数量减去实际库存。我使用这个(IFNULL(tbl_medicine.quantity-SUM(tbl_received.received_quantity),0)作为总计和DATE(NOW())>tbl_received.expiration_DATE来获取过期药品的日期。我的问题是我无法得到尚未过期的数量。如何获得过期药品的未过期数量?有人能帮我解决我的问题吗?这是我的疑问 SELECT tbl_med.sup_med_id, tbl_med.quantity, tbl_r

我把过期药品的数量减去实际库存。我使用这个
(IFNULL(tbl_medicine.quantity-SUM(tbl_received.received_quantity),0)作为总计
DATE(NOW())>tbl_received.expiration_DATE
来获取过期药品的日期。我的问题是我无法得到尚未过期的数量。如何获得过期药品的未过期数量?有人能帮我解决我的问题吗?这是我的疑问

SELECT tbl_med.sup_med_id, tbl_med.quantity, 
 tbl_received.received_quantity, tbl_med.status, 
 (IFNULL(tbl_med.quantity - SUM(tbl_received.received_quantity),0)) AS Total 
FROM 
 tbl_med 
INNER JOIN 
 tbl_received ON tbl_received.sup_med_id = tbl_med.sup_med_id 
WHERE 
 tbl_med.status = 'Active' AND DATE(NOW()) > tbl_received.expiration_date AND 
 tbl_med.barangay_id = 19
GROUP BY 
 sup_med_id HAVING Total > 0 
ORDER BY 
 sup_med_id
以上查询的输出

sup_med_id  quantity  received_quantity  status   Total
3           1800      1000               Active   800
7           1800      1000               Active   800
tbl\U med和tbl\U接收表

id   sup_med_id  received_quantity  expiration_date
1    3           1000               2019-09-04
2    7           1000               2019-09-04
3    9           1800               2022-09-04

medicine_id  sup_med_id  quantity  status    barangay_id
1            3           1800      Active    19
2            7           1800      Active    19
3            9           1800      Active    19
我希望这一切发生

sup_med_id  quantity  received_quantity  status   Total
3           1800      1000               Active   800
7           1800      1000               Active   800
9           1800      1800               Active   1800

如果药品尚未过期,我只想将数量显示为总计

问题来自于您仅在过期日期已过时才加入的事实。为解决此问题,应从
WHERE
子句中删除检查,改为在过期数量的
总和中进行检查:

SELECT tbl_med.sup_med_id, tbl_med.quantity, 
  tbl_received.received_quantity, tbl_med.status, 
  (tbl_med.quantity 
   - SUM(CASE WHEN NOW() > tbl_received.expiration_date 
              THEN tbl_received.received_quantity 
              ELSE 0 
         END)
  ) AS Total 
FROM 
  tbl_med 
INNER JOIN 
  tbl_received ON tbl_received.sup_med_id = tbl_med.sup_med_id 
WHERE 
  tbl_med.status = 'Active' AND 
  tbl_med.barangay_id = 19
GROUP BY 
  sup_med_id HAVING Total > 0 
ORDER BY 
  sup_med_id

我自己还没有测试过这个查询,但我相信它应该能够实现您想要的功能。问题在于,您只有在过期日期已过时才加入。为解决此问题,应从
WHERE
子句中删除检查,改为在过期数量的
总和中进行检查:

SELECT tbl_med.sup_med_id, tbl_med.quantity, 
  tbl_received.received_quantity, tbl_med.status, 
  (tbl_med.quantity 
   - SUM(CASE WHEN NOW() > tbl_received.expiration_date 
              THEN tbl_received.received_quantity 
              ELSE 0 
         END)
  ) AS Total 
FROM 
  tbl_med 
INNER JOIN 
  tbl_received ON tbl_received.sup_med_id = tbl_med.sup_med_id 
WHERE 
  tbl_med.status = 'Active' AND 
  tbl_med.barangay_id = 19
GROUP BY 
  sup_med_id HAVING Total > 0 
ORDER BY 
  sup_med_id

我自己还没有测试过这个查询,但我相信它应该可以达到您想要的效果

如果您想得到过期和未过期的,只需删除只过滤过期的条件即可设置rid of
和DATE(NOW())>tbl_received.expiration_date
@Barmar即使药品还没有过期,问题也在负值中…如果您想获得过期和未过期的药品,只需删除仅过滤过期药品的条件即可摆脱
和日期(NOW())>tbl_已收到。过期日期
@Barmar问题还在于,即使药品尚未过期…很高兴我能帮上忙!很高兴我能帮忙!