关于#sql#的问题:sql语句查询

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        --51日购入的3个还没有出售
    a               1         2023-03-01        --31日购入的7个还剩1个没有出售
    b               1         2023-06-01        --61日购入的1个还没有出售
    b               6         2023-04-01        --41日购入的6个还没有出售
    b               2         2023-02-01         --21日购入的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和购入日期升序排序,以便按照先入先出的原则显示购入日期。