2016-06-30 4 views
-1

Ich habe eine Tabelle mit Daten wie folgtberechnen Unterschied in Reihen mit unterschiedlichen Zeitstempel in SQL aufgezeichnet

Person_ID Date Sale 
    1  2016-05-08  2686 
    1  2016-05-09  2688 
    1  2016-05-14  2689 
    1  2016-05-18  2691 
    1  2016-05-24  2693 
    1  2016-05-25  2694 
    1  2016-05-27  2695 

und es gibt eine Million solcher IDs für verschiedene Menschen. Die Verkaufszählung wird nur aufgezeichnet, wenn sich ein Verkauf erhöht, andernfalls nicht. Daher werden Daten für id‘2 kann von id 1.

Person_ID Date Sale 
    2  2016-05-10  26 
    2  2016-05-20  29 
    2  2016-05-18  30 
    2  2016-05-22  39 
    2  2016-05-25  40 

Verkauf Anzahl von 29 auf 20.5 unterschiedlich sein bedeutet, dass er drei Produkte am 20. verkauft und hatte 26 bis 10.05 ohne Verkauf verkauft in zwischen diesen 2 Daten

Frage: Ich möchte eine SQL/dynamische SQL, um die täglich einen Umsatz von allen Agenten zu berechnen und einen Bericht wie folgt:

ID Sale_511 Sale_512 Sale_513 -------------- Sale_519 Sale_520 

    2  0   0   0  --------------- 0   3 
                   (29-26) 

Frage ist, wie kann ich mit, dass die Daten einen Bericht zu berechnen. Da ich Daten zwischen 5/20 bis 5/10 habe. SO kann ich nur eine Frage schreiben, die A-B = C sagt?

Kann jemand helfen? Vielen Dank.

P.S - Neu in SQL so zu lernen.

SQL Server 2008

+1

Willkommen bei Stackoverflow: wenn Sie Code, XML oder Datenproben zu veröffentlichen, ** ** bitte diese Zeilen im Texteditor markieren, und klicken Sie auf " Codebeispiele "button (' {} ') auf der Editor-Toolbar, um sie schön zu formatieren und zu markieren! –

+0

"Ich möchte ein SQL" ist keine Frage. Bitte stellen Sie eine Frage. – Blorgbeard

+0

Frage ist, wie verwende ich diese Daten, um einen Bericht zu berechnen. Da ich Daten zwischen 5/20 bis 5/10 habe. SO kann ich nur eine Frage schreiben, die A-B = C sagt? – nk771

Antwort

0

Die meisten SQL-Dialekte unterstützen die lag() Funktion. Sie können bekommen, was Sie wollen als:

select person_id, date, 
     (sale - lag(sale) over (partition by person_id, date)) as Daily_Sales 
from t; 

Dies erzeugt eine Zeile pro Datum für jede Person. Dieses Format ist typischer für die Art und Weise, wie SQL solche Ergebnisse zurückgibt.

In SQL Server 2008 können Sie tun:

select t.person_id, t.date, 
     (t.sale - t2.sale) as Daily_Sales 
from t outer apply 
    (select top 1 t2.* 
     from t t2 
     where t2.person_id = t.person_id and t2.date < t.date 
    ) t2 
+0

Ich bin auf SQL Server 2008. Lag-Funktion ist ungültig. – nk771

Verwandte Themen