這可能是比您想要的更長的答案,但我想解決幾個關於您的表格設置以及它們爲什麼重要的重要內容。我的解釋會稍微有些落後,但希望它會很容易遵循。
你給可以是一個有點混亂,因爲它是每個ID都是一樣的,所以我要改變他們有點像這樣的例子數據:
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 |
+ -- + --------- + -------- +
開始,如果您的表看起來像這樣,而不是答案應該是顯而易見:
Values
+ -- + ----------- + ---------------- + ---------------- + ------------- +
| Id | CurrentDate | PresentYearValue | LastQuarterValue | LastYearValue |
+ -- + ----------- + ---------------- + ---------------- + ------------- +
| 1 | 052017 | 9876 | 5432 | 1000 |
| 2 | 052017 | 6483 | 2211 | 580 |
| 3 | 052017 | 11316 | 1216 | 9487 |
+ -- + ----------- + ---------------- + ---------------- + ------------- +
然後,假設你的數據類型爲SalesQty字段不是一個小數,您可以使用下面的查詢:
select Id
, cast((PresentYearValue - LastQuarterValue) as float)/(LastQuarterValue) * 100 as QoQ
, cast((PresentYearValue - LastYearValue) as float)/(LastYearValue) * 100 as YoY
from Values
,你會得到以下結果:
Results
+ -- + ------ + ------- +
| Id | QoQ | YoY |
+ -- + ------ + ------- +
| 1 | 81.81 | 887.6 |
| 2 | 193.22 | 1017.76 |
| 3 | 830.59 | 19.28 |
+ -- + ------ + ------- +
非常簡單明瞭。
但是...
它可能並不總是做出這樣的改變你的數據庫是可行的。例如,數據可能不僅僅用於這一個單一的問題,而且以您的格式存儲它可能是最好的整體。在這種情況下,這是一個演示如何轉換數據以獲得您想要的結果。
爲了使我們的數據表看起來像我們的值表,我們需要一個明確的在Id的內部排序。在這種情況下,我們可以在YearValue字段上訂購,但如果它們是實際日期而不是字符串,則只能訂購。考慮下面的查詢:
select *, ROW_NUMBER() over (partition by Id order by YearValue desc) as RN
from Values
這給了我們類似的數據,但一個新的字段的表:
通知RN和(目前,最後)(季,年)值之間的對應關係。我們可以利用這種對應關係將這些行「轉」爲列。
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
這讓我們像
+ -- + ----------- + ---------------- + ---------------- + ------------- + -- +
| 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 |
+ -- + ----------- + ---------------- + ---------------- + ------------- + -- +
表一快速分組,我們可以收起該表格。
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
,這爲我們提供了準確的值表:
Values
+ -- + ----------- + ---------------- + ---------------- + ------------- +
| Id | CurrentDate | PresentYearValue | LastQuarterValue | LastYearValue |
+ -- + ----------- + ---------------- + ---------------- + ------------- +
| 1 | 052017 | 9876 | 5432 | 1000 |
| 2 | 052017 | 6483 | 2211 | 580 |
| 3 | 052017 | 11316 | 1216 | 9487 |
+ -- + ----------- + ---------------- + ---------------- + ------------- +
最後,掖最後查詢到的CTE,並與第一查詢結合起來,以獲得您想要的值:
; 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
在from子句之前,將所需的任何其他字段和添加到子句中。希望這可以幫助!
此表中的id是什麼? (如產品編號或相關的另一張表?任何唯一的ID) –
你好Samanvitha,該ID是在表的主鍵,它已(完全一致)3記錄每個 –
問題是什麼?你得到的結果是不正確的? – nscheaffer