运行重新启动的查询

时间:2012-05-27 20:18:32

标签: mysql sql

我正在通过phpmyadmin运行MySql数据库,我正在构建一个查询以总计一些值。

在EXCEL中,公式看起来像这样= IF(AND(P6 = P5,B6 = B5),SUM(H5 + F6),F6)

该公式放在H栏

P Column是类标识符。 B列是他们的注册号。 H列是他们的总分。 F列是其条目的分值。

在excel中效果很好。但是在SQL语法中遇到了一些麻烦。

我知道首先我需要对文件进行排序,以便按照正确的顺序完成所有操作。但从那时起,我一无所知。

如果我的excel代码需要更深入的解释,我可以做到这一点,如果它有帮助。

2 个答案:

答案 0 :(得分:1)

据我所知,你需要运行一些“分区”或行。似乎在MySql中你需要对变量做一些“黑客攻击”,因为这个数据库中没有分析函数。

以下查询将执行此操作。它使用三个变量 - @rollingsum来存储F列的总和,以及@prevP和@prevB变量来存储B和P列的先前值)

SELECT s.p, s.b, s.f, s.rollingSum FROM 
(
SELECT  p, 
        b, 
        f, 
        IF( p=@prevP AND b=@prevB,
        @rollingsum := @rollingsum + f,
        @rollingsum := f )  as rollingSum,
        @prevP := p,
        @prevB := b
FROM      test_table p, (SELECT @rollingsum := 0, @prevP := '', @prevB := '') r 
ORDER BY  p,b ) s

示例:

来源数据:

P   B   F
1   1   10
1   1   10
1   2   10
1   2   10
1   2   10
2   2   10
2   2   10
2   2   10

上述查询的结果(rollingsum列是您的H列 - 您的Excel中的总分数):

P   B   F   ROLLINGSUM
1   1   10  10
1   1   10  20
1   2   10  10
1   2   10  20
1   2   10  30
2   2   10  10
2   2   10  20
2   2   10  30

答案 1 :(得分:0)

您没有详细介绍您的表结构,因此我假设您有SOME_ID = 5和SOME_ID = 6的记录。 有了这些数据,一个可能的SQL语句将是:

select 
    (select T1.B from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) as B_PREVIOUS,
    (select T1.F from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) as F_PREVIOUS,
    (select T1.H from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) as H_PREVIOUS,
    (select T1.P from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) as P_PREVIOUS,
    B as B_CURRENT, F as F_CURRENT, H as H_CURRENT, P as P_CURRENT,
    case when
        (select T1.B from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) = B
        and
        (select T1.P from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) = P then
          (select T1.H from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) + F
  else
          F
  end as RESULT
from SOME_TABLE
where SOME_ID = :CURRENT_ID

当然,唯一需要的返回列是RESULT。我只是为了调试而返回另一个。

希望这能帮到你!

已编辑:已更新,以反映@Ben因重复搜索当前记录而导致性能下降的说明