2011-06-09 4 views
2

Le tableau se présente comme suitSélection de la valeur maximale d'une colonne avec contraint

 
Company, Vertical, Counts 

Pour chaque entreprise que je veux obtenir la somme des comptes basée sur une verticale spécifique ayant le nombre le plus élevé

 
Company  Vertical    Counts 
IBM   Finance    10 
IBM   R&D     5 
IBM   PR     2 

I aimerait obtenir la sortie suivante

 
IBM  Finance 17 
+2

Votre question est incompatible. "Je veux obtenir la somme des comptes basée sur une verticale spécifique ayant le plus grand nombre" semble que vous voulez financer = 10, mais vous dites alors que vous voulez financer = 17. Voulez-vous la verticale ou l'entreprise? –

Répondre

1

Une auto-jointure devrait le faire.

select company, vertical, total_count 
from(
    select sum(counts) as total_count 
    from table 
    )a 
cross join table 
where counts=(select max(counts) from table); 

En fonction de votre SGBDR, vous pouvez également utiliser une fonction de fenêtre (somme par exemple (nombre) sur() comme TOTAL_COUNT) et ne pas avoir à se soucier de la croix rejoindre.

+0

Ne donnera pas de résultat correct: comment cela extrait-il la ligne financière? – gbn

+0

Eh bien, compte = (sélectionnez max (nombre) à partir de la table) précisément lorsque vertical = 'Finance', donc la ligne produite par ma requête ci-dessus sera 'IBM', 'Finance', 17. –

+0

ah, je pensais que j'avais mentionné "s'il y avait plus d'une entreprise" – gbn

1

Il est une torsion sur le problème de "How to get the MAX row" (lien DBA.SE)

  1. obtenir au total et la plus verticale par entreprise dans un simple agrégat
  2. les utiliser pour identifier la ligne dans la table source

Quelque chose comme ça, non testé

SELECT 
    t.Company, t.Vertical, m.CompanyCount 
FROM 
    (--get total and highest vertical per Company 
    SELECT 
     COUNT(*) AS CompanyCount, 
     MAX(Vertical) AS CompanyMaxVertical, 
     Company 
    FROM MyTable 
    GROUP BY Company 
    ) m 
    JOIN --back to get the row for that company with highest vertical 
    MyTable t ON m.Company = t.Company AND m.CompanyMaxVertical = t.Vertical 

Ed : ceci est plus proche de la norme SQL qu'un ROW_NUMBER parce que nous ne savons pas la plate-forme

0
select Company, 
     Vertical, 
     SumCounts 
from (  
     select Company, 
       Vertical, 
       row_number() over(partition by Company order by Counts desc) as rn, 
       sum(Counts) over(partition by Company) as SumCounts 
     from YourTable 
    ) as T 
where rn = 1 
0
SELECT company, 
     vertical, 
     total_sum 
FROM (
    SELECT Company, 
      Vertical, 
      sum(counts) over (partition by null) as total_sum, 
      rank() over (order by counts desc) as count_rank 
    FROM the_table 
) t 
WHERE count_rank = 1 
Questions connexes