2011-06-13 6 views
2

J'ai essayé pendant des heures mais ne peut pas ge la requête, je veux faire ce qui suit en utilisant DB2. De la table Company et utilisateurs Je les informations de quantité de billets suivants par entreprise/utilisateurdb2 groupe de requête supérieur par

QUERY USING: 
SELECT T.USER, COUNT(T.USER) AS QUANITTY, T.COMPANY FROM TICKET T 
INNER JOIN COMPANY P ON P.COMPANY = T.COMPANY 
GROUP BY (T.USER, T.COMPANY) ORDER BY QUANTITY DESC 

Résultat est:

user   company  quantity 
---------------------------------- 
mark   nissn  300 
tom   toyt   50 
steve  kryr   80 
mark   frd   20  
tom   toyt   120  
jose   toyt   230  
tom   nissn  145  
steve  toyt   10  
jose   kryr   35  
steve  frd   100 

CE doit être le résultat (Top utilisateur par entreprise)

user   company  quantity 
---------------------------------- 
mark   nissn  300  
jose   toyt   230  
steve  frd   100  
steve  kryr   80 

comme vous pouvez le voir, il ya beaucoup d'utilisateurs dans une entreprise et chacun ont des quantités différentes par entreprise, le résultat devrait obtenir l'utilisateur avec la quantité la plus élevée par entreprise. à savoir: Société nissn il a 2 utilisateurs et chacun a (marque avec 300) et (tom avec 145)

il devrait me donner le plus grand utilisateur qui serait marque avec 300. Ce serait la même pour toyt, frd, kryr. J'ai besoin de tous dans une requête.
Je me demande si c'est possible dans une requête ou si j'ai besoin de créer une procédure stockée.

Répondre

6

Vous pouvez le faire avec analytic queries. Mais fais attention. Le modèle fonctionne généralement pour impliquer des sous-requêtes imbriquées. (Un pour produire un ensemble de données, l'autre pour l'ajouter au motif, le troisième pour sélectionner les lignes que vous voulez.)

Dans ce cas, cela devrait ressembler à ceci.

Requête initiale.

SELECT T.USER, COUNT(T.USER) AS QUANTITY, T.COMPANY 
FROM TICKET T 
    JOIN COMPANY P 
    ON P.COMPANY = T.COMPANY 
GROUP BY (T.USER, T.COMPANY) 

Requête d'analyse. (Notez que le s est de nommer le sous-requête. Je ne l'ai pas utilisé DB2, mais la norme ne les empêche pas strictement être abandonné, et je sais au moins une base de données qui les oblige.)

SELECT user, quantity, company 
    , RANK() OVER (PARTITION BY company ORDER BY quantity DESC) as r 
FROM (... previous query ...) s 

final résultat.

SELECT user, quantity, company 
FROM (... previous query ...) t 
WHERE r = 1 

La requête combinée est:

SELECT user, quantity, company 
FROM (
    SELECT user, quantity, company 
     , RANK() OVER (PARTITION BY company ORDER BY quantity DESC) as r 
    FROM (
     SELECT T.USER, COUNT(T.USER) AS QUANTITY, T.COMPANY 
      FROM TICKET T 
       JOIN COMPANY P 
       ON P.COMPANY = T.COMPANY 
      GROUP BY (T.USER, T.COMPANY) 
    ) s 
) t 
WHERE r = 1 

Comme je dis que je ne l'ai pas utilisé DB2. Mais selon la norme SQL, cette requête devrait fonctionner.

+0

vous m'avez donné le bon answear et oui cela fonctionne aussi parfaitement pour DB2 !!! J'essayais de le faire mais je ne pouvais pas comprendre. Merci Bubby! –

+0

Testé sur DB/2 sur iSeries et il fonctionne en effet! – Bjinse

+0

En outre, pensez à utiliser Dense_Rank() au lieu de Rank() pour gérer un lien entre deux sociétés. Excellent travail décomposé en instructions étape par étape @btilly – codemonkey