代码之家  ›  专栏  ›  技术社区  ›  bbutle01

MySQL存储过程问题

  •  1
  • bbutle01  · 技术社区  · 17 年前

    我有一张有贷记和借记栏的桌子。

    我需要从中获得最高的平衡,我认为存储过程是实现平衡的方法,但我不知道如何实现。

    我需要从第一行开始,加上借方,减去贷方,然后存储值A。

    第二行是A+借方贷方=B;A=最大值(A,B) 重复最后一步直到结束。

    记住,我要找的是有史以来最高的,而不是现在 金额(借贷)

    4 回复  |  直到 16 年前
        1
  •  1
  •   Bill Karwin    17 年前

    在我看来,你想要的是 A+credit-debit 但如果需要的话,可以更换它们。

    SET @balance := 0;
    SET @high := 0;
    SELECT @high := GREATEST(@balance := @balance+credit-debit, @high) FROM mytable;
    SELECT @high;
    

    编辑: 为了响应您关于从中形成存储函数的评论…与存储过程不同,存储函数必须返回一个值,因此不能包含 SELECT 查询,除非查询将其结果存储在变量中。这意味着必须保证查询具有单个值结果。下面是我要处理的函数,因为在这种情况下,您只需要 @high 无论如何:

    CREATE FUNCTION high_bal() RETURNS DECIMAL
    BEGIN
      SET @balance := 0;
      SET @high := 0;
    
      SELECT MAX(@high := GREATEST(@balance := @balance+debit_acc-credit_acc, @high))
      INTO @high
      FROM credit_acc where credit_used_acc=63395;
    
      RETURN @high;
    END$$
    
        2
  •  0
  •   bbutle01    17 年前

    实际上,我以为我会变得聪明,让它成为一个函数,因为我只想要一个值作为结果…

    定界符$$

    删除函数(如果存在) cc . high_bal $$

    创建函数 复写的副本 . 高空气球 () 返回小数

    BEGIN
    SET @balance := 0;
    SET @high := 0;
    SELECT @high := GREATEST(@balance := @balance+debit_acc-credit_acc, @high) FROM credit_acc where credit_used_acc=63395;
    
    RETURN @high;
    END$$
    
    print("code sample");
    
    DELIMITER ;
    

    但那给了我错误” 不允许返回“函数”的结果集,我不理解,因为我只需要单个值。

        3
  •  0
  •   dkretz    17 年前

    用户定义函数只是嵌入在SQL语句中的东西。它们在每一行的上下文中操作(例如40行,函数执行40次)。如果要从集合(多行)中聚合,可以使用包含聚合函数的SQL语句(例如max(columname))。这将返回一个“结果集”,恰好是一行中有一个值。

        4
  •  -1
  •   friol    17 年前

    五月

    select max(debit-credit) from yourtable
    

    工作?

    试着测试一下。