0

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

在 EXCEL 中,公式如下所示 =IF(AND(P6=P5,B6=B5),SUM(H5+F6),F6)

该公式放在 H 列中

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

它在excel中效果很好。但是在 SQL 的语法上有一些麻烦。

我知道首先我需要对文件进行排序,以便所有内容都以正确的顺序通过,明白了。但从那一刻起,我就一无所知了。

如果我的 excel 代码需要更深入的解释,我可以这样做,如果有帮助的话。

4

2 回答 2

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
于 2012-05-27T22:10:05.633 回答
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 关于由于重复搜索当前记录而导致性能下降的注释

于 2012-05-27T20:43:52.393 回答