7

次のデータを含むテーブルがあります。

ID      In       Out 
1      100.00    0.00   
2       10.00    0.00   
3        0.00   70.00    
4        5.00    0.00    
5        0.00   60.00   
6       20.00    0.00     

ここで、次の結果が得られるクエリが必要です。

ID      In       Out    Balance
1      100.00    0.00   100.00
2       10.00    0.00   110.00
3        0.00   70.00    40.00
4        5.00    0.00    45.00
5        0.00   60.00   -15.00
6       20.00    0.00     5.00

トリガーやストアド プロシージャを使用せずに、1 つのクエリでこれを行うことは可能ですか?

4

3 に答える 3

17

短い答え、はい

より長い答えは、変数を使用して、行を反復するときに集計することができます。

SELECT 
    `table`.`ID`,
    `table`.`In`,
    `table`.`Out`,
    @Balance := @Balance + `table`.`In` - `table`.`Out` AS `Balance`
FROM `table`, (SELECT @Balance := 0) AS variableInit
ORDER BY `table`.`ID` ASC

これ, (SELECT @Balance := 0) AS variableInitにより、開始前に @Balance が 0 に初期化されます。行ごとに @Balance を に設定し@Balance + In - Out、計算された値を出力します。

また、ORDER が一貫していることを確認する価値があります。そうしないと、行が返される順序によって Balance が変化します。たとえば、前後に並べたい場合は、これをサブクエリとして使用できます。これにより、外側のクエリが計算された値を処理するため、残高が正しいままになります。

SELECT
    `balanceCalculation`.`ID`,
    `balanceCalculation`.`In`,
    `balanceCalculation`.`Out`,
    `balanceCalculation`.`Balance`
FROM (
    SELECT 
        `table`.`ID`,
        `table`.`In`,
        `table`.`Out`,
        @Balance := @Balance + `table`.`In` - `table`.`Out` AS `Balance`
    FROM `table`, (SELECT @Balance := 0) AS variableInit
    ORDER BY `table`.`ID` ASC
) AS `balanceCalculation`
ORDER BY `balanceCalculation`.`ID` DESC
于 2012-02-22T12:11:13.170 に答える
4

最も簡単な答えは次のとおりです。

SELECT `ID`, 
       `In`, 
       `Out`, 
       @running_bal := @running_bal + (`In` - `Out`)  as `Balance`
FROM   tableName, (SELECT @running_bal := 0) tempName
于 2012-02-22T12:16:30.350 に答える
0

シンプルLEFT JOINで十分です:

SELECT t.ID, t.In, t.Out, (SUM(t2.In) - SUM(t2.Out)) Balance
FROM mytable t
    LEFT JOIN mytable t2 ON b2.ID <= b.ID
GROUP BY b.ID

またはサブクエリ (結果として、これは約 2 倍高速です)

SELECT t.ID, t.In, t.Out,
    (SELECT SUM(t2.In) - SUM(t2.Out) FROM mytable t2 WHERE t2.ID <= t.ID) Balance
FROM mytable t;
于 2017-01-27T04:58:51.190 に答える