2009-03-17 28 views
2

SQLデータベースで取得した値に基づいて傾向を計算したい。特に私は1つの列の値を増やすことに興味があります(値が減少した場合は値が負の値になるはずです)SQL - 数値列の値の増加率を計算する

私はこれをどうやってやるべきですか?

ストアドプロシージャは使用できません。

ありがとうございました。

私のテーブルには、

日(数値)以下の列、月(数値)、受注(数値)、私は数の変化%を計算したい

(本当の)価格を持っています1か月から次の受注の私はまた、方向が考慮されることを望む、すなわち、売上が減少した場合に返される値は-veでなければならない。トレンドを計算するために

+0

「どうすればいいですか?あなたのスキーマについての基本的な情報はありません。 – kquinn

答えて

3

sqlliteが変数を許可するかどうかは分かりませんが、これはMySQLでのやり方です。私はちょうどこれを試して、魅力的なように働いています:10〜20増加100%、46〜40減少-13.04%。

がうまくいけば、それはsqlliteで似ています:もちろん

SELECT 
    CONCAT(
    FORMAT(
     IF(@prev AND SUM(orders) <> @prev, 
      -1 * 100 * (1 - SUM(orders)/@prev), 
      0 
     ) 
     , 2) 
    , '%') AS variation, 
    @prev := SUM(orders) AS orders 
FROM 
    (SELECT @prev := NULL) init, 
    product 
GROUP BY 
    id_product 
ORDER BY 
    month 

、あなたが必要として、出力を微調整する必要があります。これは、現在、2桁の小数点以下の桁数をフォーマットし、最後に "%"を付加します。

1

、あなたが興味を持っている値の履歴データを格納する必要があります。あなたは年+月(YYYYMM)と整数列を持っている場合

1

が有用であるべき

cast(
    cast(year(date) as nvarchar) + 
    replicate('0',2-len(cast(month(date) as nvarchar))) + 
    cast(month(date) as nvarchar) 
as int) 

次にグループ化して以前の値を取得して計算するだけです。

select yearmonth, 
     sum(t.orders), 
     (sum(t.orders)/(select top 1 sum(orders) 
         from table 
         where yearmonth<t.yearmonth 
         group by yearmonth 
         order by yearmonth desc)-1)*100. as pct 
from table t 
group by yearmonth 

T-SQL構文は、あなたがsqliteの

PSでそれを使用することができますことを願っています:ゼロ除算チェックは、さらに問題を避けるために行われなければなりません。

1

コラム日についてわからないが、月額たった1行があれば、答えは可能性があり(私はsqliteのを持っていないが、私はこの答えは、ANSIのSQLだと思う):

select t.date 
,  t.month 
,  t.orders 
,  case when t2.orders = 0 then 
      99999.0 
     else 
      100.0 * (t.orders - t2.orders)/t2.orders 
     end "increase" 
from t 
left join t t2 on t2.month = t.month - 1 
order by t.month