2017-09-12 8 views
0

Je possède ce jeu de données à l'aide de Microsoft SQL Server Management StudioClassement par 2 différents niveaux de partitionnement/regroupement

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 

Ce que je veux faire est de rang par prix des denrées alimentaires, mais le groupe par catégorie, ordre par catégorie, animal familier, date et ensuite classer par dépenses vétérinaires, mais grouper par catégorie, classer par catégorie, nom animal, date et ensuite classer par tva, mais grouper par catégorie, classer par catégorie, nom animal, date.

Je pense que ce sera une déclaration de jointure pour le tableau ci-dessus?

Quelque chose exactement comme ci-dessous:

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 

NB: ce n'est pas nécessaire dans la sortie finale, mais pour le rendre plus facile à lire que j'ai commandé le résultat par catégorie, nom d'animal de compagnie, date:

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 

Le code que j'ai ci-dessous ne se classe que par catégorie, mais ne se regroupe pas par prix des aliments, frais vétérinaires et TVA.

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

Serait-ce un cas de regrouper les coûts séparément puis gauche de rejoindre les classements sur les données d'origine?

(je vais utiliser les pivots et les trancheuses dans Excel veulent donc avoir toutes les données sur une table/requête)

+0

Je pense que quelqu'un d'autre a répondu quelque chose comme ça pour moi il y a un certain temps, voir si elle correspond à votre problème : https://stackoverflow.com/questions/19552316/oracle-order-by-different-columns-same-select-statement c'est Oracle mais je pense qu'il * peut * s'appliquer. –

+0

pas tout à fait, j'essaye de classer par prix de nourriture, classer par catégorie, classer par catégorie, nom d'animal familier, date puis classer par dépenses de vétérinaire, classer par catégorie, classer par catégorie, nom d'animal familier, date ... etc. Je vais modifier ma question – VS1SQL

+0

Je suis confus sur la question. Demandez-vous comment obtenir les rangs ou est-ce l'ordre réel des résultats finaux qui pose problème? – SQLChao

Répondre

0

Après la marche loin avec un peu de temps pour rafraîchir mon cerveau j'ai eu un moment eurêka et résolu ce problème. C'était vraiment facile quand j'y ai pensé.

si

le code pour obtenir la table souhaitée va quelque chose comme ceci:

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]