2012-07-17 4 views
4

J'ai une table de données comme ceci:Rang SQL Server() par groupe

Employee1 Product1 ProductGroup1 Quantity SalesDate 
Employee1 Product1 ProductGroup1 Quantity SalesDate 
Employee1 Product2 ProductGroup1 Quantity SalesDate 
Employee1 Product2 ProductGroup1 Quantity SalesDate 
Employee2 Product1 ProductGroup1 Quantity SalesDate 
Employee2 Product1 ProductGroup1 Quantity SalesDate 
Employee2 Product1 ProductGroup1 Quantity SalesDate 
Employee2 Product1 ProductGroup1 Quantity SalesDate 
Employee2 Product2 ProductGroup1 Quantity SalesDate 
Employee2 Product2 ProductGroup1 Quantity SalesDate 

Il y a plusieurs employés, plusieurs produits, groupes de produits multiples, plusieurs dates de vente. Dans les services de reporting, j'ai une matrice, où le groupe parent est employé, le groupe enfant est Produit et le groupe de colonnes est la date de vente. J'ai besoin de classer les produits, afin d'obtenir le premier 5 et mettre l'autre dans une autre liste. Le problème est que je dois classer le produit dans le groupe d'employés et que le produit peut avoir plusieurs dates de vente, alors que j'ai besoin de tout évaluer. En SQL maintenant j'ai: Rank() Over (partition by DataTable.ProductGroup1, DataTable.Employee Order by Sum(Quantity) desc) as Rank Mais cela me donne un mauvais résultat, parce que le même produit a une valeur de classement différente, parce que la fonction de classement se classe en utilisant la quantité dans différentes dates de vente. comment dois-je écrire sql, donc il me renvoie les données avec toutes les dates de vente, les rangs d'autobus en utilisant la quantité additionnée de toutes les dates?

EDIT:
Quelques jeux de données pour expliquer ce que je reçois et ce dont j'ai besoin.

//DATA I HAVE 
Employee_col Product_col ProductGroup_col Quantity_col SalesDate_col 
Employee1  Product1 ProductGroup1  100    2012-01 
Employee1  Product1 ProductGroup1  200    2012-02 
Employee1  Product2 ProductGroup1  50    2012-01 
Employee1  Product2 ProductGroup1  80    2012-02 
Employee2  Product1 ProductGroup1  200    2012-01 
Employee2  Product1 ProductGroup1  70    2012-02 
Employee2  Product2 ProductGroup1  20    2012-01 
Employee2  Product2 ProductGroup1  450    2012-02 

//RESULT I GET 
Employee_col Product_col ProductGroup_col Quantity_col SalesDate_col Rank_col 
Employee1  Product1 ProductGroup1  100    2012-01   2 
Employee1  Product1 ProductGroup1  200    2012-02   1 
Employee1  Product2 ProductGroup1  50    2012-01   4 
Employee1  Product2 ProductGroup1  80    2012-02   3 
Employee2  Product1 ProductGroup1  200    2012-01   2 
Employee2  Product1 ProductGroup1  70    2012-02   3 
Employee2  Product2 ProductGroup1  20    2012-01   4 
Employee2  Product2 ProductGroup1  450    2012-02   1 

//RESULT I NEED 
Employee_col Product_col ProductGroup_col Quantity_col SalesDate_col Rank_col 
Employee1  Product1 ProductGroup1  100    2012-01   1 
Employee1  Product1 ProductGroup1  200    2012-02   1 
Employee1  Product2 ProductGroup1  50    2012-01   2 
Employee1  Product2 ProductGroup1  80    2012-02   2 
Employee2  Product1 ProductGroup1  200    2012-01   2 
Employee2  Product1 ProductGroup1  70    2012-02   2 
Employee2  Product2 ProductGroup1  20    2012-01   1 
Employee2  Product2 ProductGroup1  450    2012-02   1 
+0

Pouvez-vous fournir des données d'échantillons, la sortie de requête incorrecte (ce que vous » ve essayé), et la sortie attendue de la requête? J'ai un peu de mal à te suivre. –

+0

classement à faire, produit sage ou productgroup sage? –

+0

@JNM Il est probable que vous n'obtiendrez pas de réponse car la question n'est pas claire. Pouvez-vous s'il vous plaît donner des exemples spécifiques, des exemples d'entrées et des résultats attendus afin que nous puissions vous aider. – 18bytes

Répondre

4

Essayez cette requête

select 
#t.*, salesrank 
from #t 
inner join 
(
    select Employee, Product, RANK() over (partition by employee order by sq desc) as salesrank 
    from 
    (select Employee, Product , SUM (Quantity) sq from #t group by Employee, product) v 
) v 
    on #t.product = v.product 
    and #t.Employee =v.Employee 
+0

Thsi est presque identique à ce que j'ai fait. Je suppose qu'il n'y a pas de meilleure solution. – JNM

3

RANK() sur (partition par Employee_col, Product_col, ordre SalesDate_col par Quantity_col ASC)

+6

Avez-vous lu ce que l'OP a dit à propos de son essai avec rank()? Si oui, vous devriez élaborer et expliquer pourquoi votre réponse est bonne. – manuell

+0

Ceci est un excellent usage de ** PARTITION BY **! – Mitch