按 partitioning/grouping 的 2 个不同级别排名

Rank by 2 different levels of partitioning/grouping

我使用 Microsoft SQL Server Management Studio

有这组数据
Category|pet name|   date   |food price|vet expenses|vat
A       | jack   |2017-08-28|   12.98  |    2424    |23
A       | jack   |2017-08-29|   2339   |    2424    |23
A       | smithy |2017-08-28|   22.35  |    2324    |12
A       | smithy |2017-08-29|   123.35 |    2432    |23
B       | casio  |2017-08-28|   11.38  |    44324   |32
B       | casio  |2017-08-29|   2.24   |    3232    |43
B       | lala   |2017-08-28|   343.36 |    42342   |54
B       | lala   |2017-08-29|   34.69  |    22432   |54
C       | blue   |2017-08-28|   223.02 |    534654  |78
C       | blue   |2017-08-29|   321.01 |    6654    |67
C       | collie |2017-08-28|   232.05 |    4765    |43
C       | collie |2017-08-29|   233.03 |    4654    |65

我想做的是按食品价格排序,但按类别分组,按类别排序,宠物名称,日期,然后按兽医费用排序,但按类别分组,按类别排序,宠物名称、日期,然后按增值税排名,但按类别分组,按类别、宠物名称、日期排序。

我认为这将是上面 table 的连接语句?

完全像下面的内容:

Category|pet name|   date   |food price|vet expenses|vat|Rankfp|Rankve|Rankvat
A       | jack   |2017-08-28|   12.98  |    2424    |23 | 2    |  1   |1
A       | jack   |2017-08-29|   2339   |    2424    |23 | 1    |  2   |1
A       | smithy |2017-08-28|   22.35  |    2324    |12 | 1    |  2   |2
A       | smithy |2017-08-29|   123.35 |    2432    |22 | 2    |  1   |2
B       | casio  |2017-08-28|   11.38  |    44324   |32 | 2    |  1   |2
B       | casio  |2017-08-29|   2.24   |    3232    |43 | 2    |  2   |2
B       | lala   |2017-08-28|   343.36 |    42342   |54 | 1    |  2   |1
B       | lala   |2017-08-29|   34.69  |    22432   |54 | 1    |  1   |1
C       | blue   |2017-08-28|   223.02 |    534654  |78 | 2    |  1   |1
C       | blue   |2017-08-29|   321.01 |    6654    |67 | 1    |  1   |1
C       | collie |2017-08-28|   232.05 |    4765    |43 | 1    |  2   |2
C       | collie |2017-08-29|   233.03 |    4654    |65 | 2    |  2   |2

注意:这在最终输出中不需要,但为了使其更具可读性,我按类别、宠物名称、日期对结果进行了排序:

Category|pet name|   date   |food price|vet expenses|vat|Rankfp|Rankve|Rankvat
A       | jack   |2017-08-28|   12.98  |    2424    |23 | 2    |  1   |1
A       | smithy |2017-08-28|   22.35  |    2324    |12 | 1    |  2   |2
A       | jack   |2017-08-29|   2339   |    2424    |23 | 1    |  2   |1
A       | smithy |2017-08-29|   123.35 |    2432    |22 | 2    |  1   |2
B       | casio  |2017-08-28|   11.38  |    44324   |32 | 2    |  1   |2
B       | lala   |2017-08-28|   343.36 |    42342   |54 | 1    |  2   |1
B       | lala   |2017-08-28|   343.36 |    42342   |54 | 1    |  2   |1
B       | lala   |2017-08-29|   34.69  |    22432   |54 | 1    |  1   |1
C       | blue   |2017-08-28|   223.02 |    534654  |78 | 2    |  1   |1
C       | collie |2017-08-28|   232.05 |    4765    |43 | 1    |  2   |2
C       | blue   |2017-08-29|   321.01 |    6654    |67 | 1    |  1   |1
C       | collie |2017-08-29|   233.03 |    4654    |65 | 2    |  2   |2

我下面的代码只按类别排名,但不按食品价格、兽医费用和增值税分组。

RANK ()OVER(PARTITION BY [Category], [Date] order by [Category] ,[Pet Name],[Date]) as 'Rank' 

是否可以将成本单独分组然后在原始数据上加入排名?

(我将在 excel 中使用枢轴和切片器,因此希望将所有数据放在一个 table/query 上)

离开一段时间后,我灵机一动,解决了这个问题。想想其实很简单

所以

获得所需 table 的代码如下所示:

select *

, rank ()OVER(PARTITION BY [Category], [date] order by [food price], [Category] ,[pet name],[date]) as 'Rankfp' 
, rank ()OVER(PARTITION BY [Category], [date] order by [vet expenses], [Category] ,[pet name], [date]) as 'Rankve' 
, rank ()OVER(PARTITION BY [Category], [date] order by [vat], [Category] ,[pet name], [date]) as 'Rankvat' 

from petcost
order by [category, [pet name]