Dies ist wahrscheinlich eine längere Antwort als Sie wollen, aber ich möchte einige wichtige Dinge über Ihre Tabelle Setup und warum sie wichtig sind. Meine Erklärung wird ein bisschen zurück sein, aber hoffentlich wird es leicht zu folgen sein.
Das Beispiel Daten, die Sie geben, kann ein wenig verwirrend sein, weil es für jeden ID gleich ist, so werde ich sie ein wenig ändern wie folgt aussehen:
Data
+ -- + --------- + -------- +
| Id | YearValue | SalesQty |
+ -- + --------- + -------- +
| 1 | 052017 | 9876 |
| 1 | 032017 | 5432 |
| 1 | 052016 | 1000 |
| 2 | 052017 | 6483 |
| 2 | 032017 | 2211 |
| 2 | 052016 | 580 |
| 3 | 052017 | 11316 |
| 3 | 032017 | 1216 |
| 3 | 052016 | 9487 |
+ -- + --------- + -------- +
zu starten, die Antwort würde sofort klar, wenn Ihre Tabelle wie folgt aussah statt:
Values
+ -- + ----------- + ---------------- + ---------------- + ------------- +
| Id | CurrentDate | PresentYearValue | LastQuarterValue | LastYearValue |
+ -- + ----------- + ---------------- + ---------------- + ------------- +
| 1 | 052017 | 9876 | 5432 | 1000 |
| 2 | 052017 | 6483 | 2211 | 580 |
| 3 | 052017 | 11316 | 1216 | 9487 |
+ -- + ----------- + ---------------- + ---------------- + ------------- +
Dann Ihren Datentyp für das SalesQty Feld unter der Annahme ist nicht eine Dezimalzahl, können Sie die folgende Abfrage verwenden:
select Id
, cast((PresentYearValue - LastQuarterValue) as float)/(LastQuarterValue) * 100 as QoQ
, cast((PresentYearValue - LastYearValue) as float)/(LastYearValue) * 100 as YoY
from Values
und Sie erhalten die folgenden Ergebnisse:
Results
+ -- + ------ + ------- +
| Id | QoQ | YoY |
+ -- + ------ + ------- +
| 1 | 81.81 | 887.6 |
| 2 | 193.22 | 1017.76 |
| 3 | 830.59 | 19.28 |
+ -- + ------ + ------- +
Sehr einfach und unkompliziert.
ABER ...
Es ist nicht immer möglich sein kann Änderungen wie diese in Ihrer Datenbank zu machen. Zum Beispiel werden die Daten wahrscheinlich für mehr als nur dieses einzelne Problem verwendet und die Speicherung in Ihrem Format ist möglicherweise die beste überhaupt. In diesem Fall wird hier erläutert, wie Sie die Daten so transformieren, dass die gewünschten Ergebnisse erzielt werden.
Um unsere Datentabelle wie unsere Werte Tabelle aussehen zu lassen, benötigen wir eine explizite Bestellung innerhalb der IDs. In diesem Fall können wir das YearValue-Feld aber nur bestellen, wenn es sich um tatsächliche Daten handelt, nicht um Zeichenfolgen. Betrachten Sie die folgende Abfrage:
select *, ROW_NUMBER() over (partition by Id order by YearValue desc) as RN
from Values
Dies gibt uns eine Tabelle ähnlich Daten aber mit einem neuen Feld:
Data
+ -- + --------- + -------- + -- +
| Id | YearValue | SalesQty | RN |
+ -- + --------- + -------- + -- +
| 1 | 052017 | 9876 | 1 | -- PresentYearValue
| 1 | 032017 | 5432 | 2 | -- LastQuarterValue
| 1 | 052016 | 1000 | 3 | -- LastYearValue
| 2 | 052017 | 6483 | 1 | -- repeat
| 2 | 032017 | 2211 | 2 |
| 2 | 052016 | 580 | 3 |
| 3 | 052017 | 11316 | 1 |
| 3 | 032017 | 1216 | 2 |
| 3 | 052016 | 9487 | 3 |
+ -- + --------- + -------- + -- +
Beachten Sie die Korrespondenz zwischen RN und (Gegenwart, Last) (Quartal, Jahr) Wert . Wir können diese Korrespondenz ausnutzen, um die Zeilen in Spalten zu "schwenken".
select a.Id
, case RN when 1 then a.YearValue end as CurrentDate
, case RN when 1 then a.SalesQty end as PresentYearValue
, case RN when 2 then a.SalesQty end as LastQuarterValue
, case RN when 3 then a.SalesQty end as LastYearValue
, a.RN as RN
from (
select *, ROW_NUMBER() over (partition by id order by SalesQty desc) as RN
from #Values
) a
, die uns wie
+ -- + ----------- + ---------------- + ---------------- + ------------- + -- +
| Id | CurrentDate | PresentYearValue | LastQuarterValue | LastYearValue | RN |
+ -- + ----------- + ---------------- + ---------------- + ------------- + -- +
| 1 | 2017-05-01 | 9876 | NULL | NULL | 1 |
| 1 | 2017-05-01 | NULL | 5432 | NULL | 2 |
| 1 | 2017-05-01 | NULL | NULL | 1000 | 3 |
| 2 | 2017-05-01 | 6483 | NULL | NULL | 1 |
| 2 | 2017-05-01 | NULL | 2211 | NULL | 2 |
| 2 | 2017-05-01 | NULL | NULL | 580 | 3 |
| 3 | 2017-05-01 | 11316 | NULL | NULL | 1 |
| 3 | 2017-05-01 | NULL | 9487 | NULL | 2 |
| 3 | 2017-05-01 | NULL | NULL | 1216 | 3 |
+ -- + ----------- + ---------------- + ---------------- + ------------- + -- +
Mit einer schnellen Gruppierung eine Tabelle gibt wir diese Tabelle kollabieren können.
select a.Id
, max(case RN when 1 then a.YearValue end) as CurrentDate
, max(case RN when 1 then a.SalesQty end) as PresentYearValue
, max(case RN when 2 then a.SalesQty end) as LastQuarterValue
, max(case RN when 3 then a.SalesQty end) as LastYearValue
from (
select *, ROW_NUMBER() over (partition by id order by YearValue desc) as RN
from Data
) a
group by a.Id
und das gibt uns genau die Werte Tabelle:
Values
+ -- + ----------- + ---------------- + ---------------- + ------------- +
| Id | CurrentDate | PresentYearValue | LastQuarterValue | LastYearValue |
+ -- + ----------- + ---------------- + ---------------- + ------------- +
| 1 | 052017 | 9876 | 5432 | 1000 |
| 2 | 052017 | 6483 | 2211 | 580 |
| 3 | 052017 | 11316 | 1216 | 9487 |
+ -- + ----------- + ---------------- + ---------------- + ------------- +
Schließlich stecken die letzte Abfrage in einen CTE und es mit der ersten Abfrage kombinieren, um die Werte erhalten Sie wollen:
; with
Values as (
select a.Id
, max(case RN when 1 then a.YearValue end) as CurrentDate
, max(case RN when 1 then a.SalesQty end) as PresentYearValue
, max(case RN when 2 then a.SalesQty end) as LastQuarterValue
, max(case RN when 3 then a.SalesQty end) as LastYearValue
from (
select *, ROW_NUMBER() over (partition by id order by YearValue desc) as RN
from Data
) a
group by a.Id
)
select Id
, cast((PresentYearValue - LastQuarterValue) as float)/(LastQuarterValue) * 100 as QoQ
, cast((PresentYearValue - LastYearValue) as float)/(LastYearValue) * 100 as YoY
from Values
Fügen Sie alle zusätzlichen Felder, die Sie wollen, und Ihre in Klausel vor der Klausel from. Hoffe das hilft!
Was ist ID hier in dieser Tabelle? (wie Produkt-ID oder eine eindeutige ID in Bezug auf eine andere Tabelle?) –
Hallo Samanvitha, die ID ist Primärschlüssel in der Tabelle und es hat (genau) 3 Datensätze jeweils –
Was ist das Problem? Was ist das Ergebnis, das Sie bekommen, das ist nicht korrekt? – nscheaffer