table1表(购进):table1表是购进表,是随时间变化,
dates goodsid num taxprice
2023-01-01 a 8 20
2023-02-01 b 9 30
2023-03-01 a 7 20
2023-04-01 b 6 30
2023-05-01 a 3 20
2023-06-01 b 1 30
table2表(结余):table2表是结存表,因为随时有销售,结余表也随时变化
goodsid balance
a 4
b 9
假设先入先出,根据结余时点数量,查询出结余产品的购入日期,即dates列
因为a产品结余4个,b产品结余9个,新查询表就是这个样子
goodsid balance dates
a 3 2023-05-01 --5月1日购入的3个还没有出售
a 1 2023-03-01 --3月1日购入的7个还剩1个没有出售
b 1 2023-06-01 --6月1日购入的1个还没有出售
b 6 2023-04-01 --4月1日购入的6个还没有出售
b 2 2023-02-01 --2月1日购入的9个还剩2个没有出售
请问该如何写这个sql查询语句?
查询语句如下:
SELECT t2.goodsid, t2.balance, t1.dates
FROM table1 t1
JOIN (
SELECT goodsid, SUM(num) AS balance
FROM table2
GROUP BY goodsid
) t2 ON t1.goodsid = t2.goodsid
WHERE t2.balance > 0
ORDER BY t2.goodsid, t1.dates ASC;
解释:
首先,我们需要计算出每个商品的结余数量,这可以通过对table2表进行分组求和得到。我们将这个结果作为子查询,命名为t2。
然后,我们将t1表与t2表进行内连接(JOIN),以便只返回结余数量大于0的商品。我们还需要使用WHERE子句来过滤结果,只保留符合条件的记录。
最后,我们按照商品ID和购入日期升序排序,以便按照先入先出的原则显示购入日期。