2009-03-17 16 views
2

Ich möchte einige Trends basierend auf den Werten berechnen, die ich in meiner SQL-Datenbank erhalte. Besonders interessiert mich, die% Zunahme der Werte in einer Spalte zu erhalten (der Wert sollte negativ sein, wenn die Werte abgenommen haben)SQL - Prozentuale Erhöhung der Werte einer numerischen Spalte berechnen

Kann mir bitte jemand sagen, wie ich das machen soll?

Ich kann gespeicherte Prozeduren nicht verwenden.

Danke.

Meine Tabelle hat die folgenden Spalten

Datum (numerisch), Monat (numerisch), Bestellungen (numerisch), Preis (real)

ich das% der Veränderung der Anzahl berechnet werden soll von Bestellungen von einem Monat bis zum nächsten erhalten. Ich möchte auch, dass die Richtung eine Überlegung ist, d. H. Der zurückgegebene Wert sollte -ve sein, falls die Verkäufe gesunken sind.

+0

"Kann mir bitte jemand sagen, wie ich das machen soll?" Nicht ohne einige grundlegende Informationen zu Ihrem Schema. – kquinn

Antwort

3

Ich bin mir nicht sicher, ob sqllite Variablen erlaubt, aber so mache ich es in MySQL. Ich habe es gerade getestet und arbeitete wie ein Zauber: gedruckt 100% für eine 10 bis 20 Erhöhung, -13.04% für 46 bis 40 Abnahme.

Hoffentlich ist es ähnlich in 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 

Natürlich, werden Sie Ausgang zwicken müssen, wie Sie benötigen. Dies formatiert derzeit die Präcentagen auf 2 Dezimalstellen und fügt am Ende ein "%" an.

1

Um Trends zu berechnen, müssen Sie historische Daten der Werte speichern, die Sie interessieren.

1

Sollte nützlich sein, wenn Sie eine Integer-Spalte mit dem Jahr + Monat (YYYYMM) haben

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

Dann müssen Sie nur gruppieren, den vorherigen Wert erhalten und berechnen.

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-Syntax, hoffen, dass Sie es in SQLite

PS verwenden können: Eine Division durch Null-Check muss um weitere Probleme zu vermeiden, erfolgen.

1

Nicht sicher über die Spalte Datum, aber wenn es nur 1 Zeile pro Monat ist, könnte die Antwort sein (ich habe nicht SQLite, aber ich denke, diese Antwort ist 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 
Verwandte Themen