0

私はphpmyadminを介してMySqlデータベースを実行しており、いくつかの値を合計するクエリの構築に取り組んでいます。

EXCELでは、式は次のようになります= IF(AND(P6 = P5、B6 = B5)、SUM(H5 + F6)、F6)

その式はH列に入れられます

P列はクラス識別子です。B列は登録番号です。H列はそれらの合計ポイントです。F列は、エントリのポイント値です。

それはExcelでうまく機能します。しかし、SQLの構文に問題があります。

まず、すべてが正しい順序で処理されるようにファイルを並べ替える必要があることを知っています。しかし、その時点から私は無知です。

私のExcelコードについてより詳細な説明が必要な場合は、それが役立つ場合はそれを行うことができます。

4

2 に答える 2

1

私が理解している限り、いくつかの「パーティション化」または行を含む現在の合計が必要です。このデータベースでは分析関数が利用できないため、MySqlでは変数を使用して「ハッキング」を行う必要があるようです。

次のクエリがそれを行います。3つの変数を使用します-@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 に答える