【问题标题】:How to get subsequent total of column in next row using mysql select query如何使用mysql select查询获取下一行中的后续列总数
【发布时间】:2019-09-03 09:51:19
【问题描述】:

我正在为股票输入创建一个 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);

【问题讨论】:

标签: mysql sql mariadb sql-query-store


【解决方案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

【讨论】:

  • 谢谢,兄弟,它在 MySQL 8 中工作,但我使用的是 xamp,在其中,它不起作用..非常感谢你的回答。
  • #1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 4 行的 '(PARTITION BY product_code ORDER BY ID) FROM stock_table LIMIT 0, 25' 附近使用正确的语法
  • 首先是对 Qty_Total 说意外的令牌
  • 看来您使用的是不支持窗口功能的 MariaDB。试试 Barbaros Özhan 的回答。
  • 当我删除 Qty_Total 时,它显示上面的错误 #1064
【解决方案2】:

您的 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) 上建立索引。

【讨论】:

    【解决方案3】:

    您可以使用相关子查询通过增加ID 值来对所需列进行汇总:

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

    Demo

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

    ( select sum(`qty`) 
        from `stock_table` 
       where `ID` <= t.`ID` 
         and `product_code` = t.`product_code` ) as "Qty Total"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多