这可能是比您想要的更长的答案,但我想解决几个关于您的表格设置以及它们为什么重要的重要内容。我的解释会稍微有些落后,但希望它会很容易遵循。
你给可以是一个有点混乱,因为它是每个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