我正在通过phpmyadmin运行MySql数据库,我正在构建一个查询以总计一些值。
在EXCEL中,公式看起来像这样= IF(AND(P6 = P5,B6 = B5),SUM(H5 + F6),F6)
该公式放在H栏
中P Column是类标识符。 B列是他们的注册号。 H列是他们的总分。 F列是其条目的分值。
在excel中效果很好。但是在SQL语法中遇到了一些麻烦。
我知道首先我需要对文件进行排序,以便按照正确的顺序完成所有操作。但从那时起,我一无所知。
如果我的excel代码需要更深入的解释,我可以做到这一点,如果它有帮助。
答案 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因重复搜索当前记录而导致性能下降的说明