按2个不同级别的分区/分组排名

时间:2017-09-12 15:12:06

标签: sql-server join grouping partitioning ranking

我使用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

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

我认为这将是上表中的连接声明?

完全像下面的东西:

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中使用枢轴和切片器,因此希望将所有数据放在一个表/查询中)

1 个答案:

答案 0 :(得分:0)

走开一段时间后,我的脑子里有一个尤里卡时刻并解决了这个问题。当我想到它时,它实际上很容易。

所以

获取所需表格的代码如下:

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]