1

我正在为股票输入创建一个 SQL 查询。在最后一栏中,我需要上一次股票购买的总额。

S No    Product Code    Qty     Qty Total
1       PO1             5       5  
2       PO1             12      17
3       PO1             10      27
4       PO1              8      35
5       PO1              9      44
6       PO1             16      60

在最后一列的每一行中,我添加了所有先前的数量,例如 S 号。1 数量为 5。在 S 号 2 中,我添加数量 5 和 12=17。S No 3 我正在添加 5 + 12+10=27 和 Soo。

如果这是一个重复的问题,我很抱歉。我搜索了谷歌和 StackOverflow,但没有得到答案。我是 MySQL 新手,我在下面添加了查询。我是 SQL 新手,感谢任何帮助,

提前致谢。

CREATE TABLE `stock_table` (
  `ID` int(11) NOT NULL,
  `product_code` varchar(20) NOT NULL,
  `qty` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `stock_table` (`ID`, `product_code`, `qty`) VALUES
(1, 'PO1', 5),
(2, 'PO1', 12),
(3, 'PO1', 10),
(4, 'PO1', 8),
(5, 'PO1', 9),
(6, 'PO1', 16);
4

3 回答 3

1

你需要一个流动的总和。如果您使用的是 MySQL v 8.0,您可以使用 SUM 窗口函数 -

SELECT `ID`,
       `product_code`,
       `qty`,
       SUM(`qty`) OVER (PARTITION BY `product_code` ORDER BY `ID`)  Qty_Total
FROM `stock_table`;

fiddle

于 2019-09-03T09:54:25.870 回答
0

随着行的增加,您可以使用相关子查询来总结所需的列IDvalue :

select t.*,
       ( select sum(`qty`) from `stock_table` where `ID` <= t.`ID` ) as "Qty Total"
  from `stock_table` t
 order by t.`ID`;

Demo

PS:由于示例数据具有唯一product_code值,因此我不需要product_code在子查询中包含与列匹配相关的部分,如果是这种情况,请考虑将派生列转换为:

( select sum(`qty`) 
    from `stock_table` 
   where `ID` <= t.`ID` 
     and `product_code` = t.`product_code` ) as "Qty Total"
于 2019-09-03T09:56:12.163 回答
0

您的 MariaDB 版本不支持窗口函数。这让你有两个选择。一种是相关子查询;二是变数。

第一个更容易实现:

select st.*,
       (select sum(st2.qty)
        from stock_table st2
        where st2.product_code = st.product_code and
              st2.id <= st.id
       ) as running_qty
from stock_table st;

出于性能考虑,您需要在stock_table(product_code, id, qty).

于 2019-09-03T11:02:39.320 回答