2017-11-17 13 views
0

私はテーブルEmployeesに2つのカラムYearUserCountを持っています。 表は、今私は年と2年のその後USERCOUNTの違いを印刷するこの変数の値をmysqlに値を出力せずに更新する

Year UserCount 

2001 400 

2002 1000 

2003 2000 

ようになります。

私はこのようなものを出力したいと思います。

Year UserCount 

2001 400 

2002 600 

2003 1000 

私は、変数を取り、0でそれを初期化し、すべての反復後にその値を更新するものと考えます。これは私が違いを取得していますが、それはあまりにも新しい列を追加し、@prev := (Count)けれども私は

SET @prev = 0; 
select year, (UserCount - @prev) as diff, @prev := (UserCount) from Employees; 

を思い付いたクエリは、私はその値を印刷することなくprevの値を更新することができたことにより、どのような方法がありますか?

これ以外の方法がありますか?

答えて

1

この差分ハックを処理するために必要な列は、外部クエリを使用して隠すことができます。これにより、返された結果セットから更新列:=が削除されます。 (http://sqlfiddle.com/#!9/918a75/1/0

select year, diff 
    from (
     select year, (UserCount - @prev) as diff, @prev := (UserCount) 
      from Employees 
      join (select @prev:= 0) init 
     order by year 
     ) subquery 

いくつか注意してください。

  1. 初期化はjoin句に移動されます。

  2. テーブルをORDERするのは常にスマートです。あなたが結果セットをしない場合、順序は予測できません。これは悪いです。

1

値を追加して同じ値を式で差し引くことができれば、それは取り消されます。

しかし、なぜあなたはこれを行う必要があると感じるのですか?必要のないクエリ結果に余分な列を持つことは問題ではありません。あなたのアプリケーションコードはそれを表示する必要はありません。

関連する問題