0
votes

Requête SQL: comptez le nombre de valeurs distinctes dans une table

J'essaie de créer une requête SQL pour compter le nombre de valeurs distinctes dans une table SQL. Mon tableau comporte 6 colonnes:

  value  frequency
______________________
    3       4
    4       1
    5       2
    7       2
    9       2
    11      2       
    15      3
    17      3   
    20      3
    26      3
    28      2
    30      3
    40      3
    55      1
    56      1

Et voici le résultat que j'essaie d'obtenir:

n1  n2  n3  n4  n5  n6
______________________
3   5   7   9   11  20
3   7   11  15  17  20
3   15  26  28  30  40
15  26  30  40  55  56
3   4   5   9   15  17
17  20  26  28  30  40

Donc, fondamentalement, j'ai besoin de la requête pour regarder la table entière, prendre note de chaque valeur qui apparaît et compter le nombre de fois que cette valeur particulière apparaît.


1 commentaires

UNION TOUS 5 fois, GROUP BY le résultat.


3 Réponses :


1
votes

Utilisez UNION ALL pour obtenir toutes les valeurs de colonne nX dans 1 colonne et agréger:

select value, count(*) as frequency
from (
  select n1 as value from tablename union all
  select n2 from tablename union all
  select n3 from tablename union all
  select n4 from tablename union all
  select n5 from tablename union all
  select n6 from tablename 
) t
group by value


1 commentaires

Juste une note, la value est un mot réservé ANSI SQL (et par plusieurs produits dbms aussi.) En.wikipedia.org/wiki/SQL_reserved_words .



1
votes

voici le beau cas d'utilisation d' UNPIVOT si vous utilisez SQL SERVER ou ORACLE :

SELECT 
  [value]
  , count(*) frequency 
FROM 
( select n1,n2,n3,n4,n5,n6 from tablename) p
UNPIVOT ([value] for nums in ( n1,n2,n3,n4,n5,n6 )) as unpvt
GROUP BY [value]
ORDER BY frequency DESC

qui est plus efficace que l'Union, si la performance compte là-bas.


2 commentaires

Réponse spécifique au produit à une question sans dbms spécifié. Au moins, dites-nous à quels dbms il s'agit.


J'utilise Microsoft SQL Server. Les deux solutions fonctionnent à merveille. Merci @Forpas et Eshirvana (et Jarlh pour la direction à suivre)



1
votes

Je recommanderais cross apply à cet effet:

select v.n, count(*) as frequency
from t cross apply
     (values (n1), (n2), (n3), (n4), (n5), (n6)) v(n)
group by v.n;

cross apply , qui implémente une jointure latérale, est plus efficace que l' union all pour les données non pivotantes. Cela est particulièrement vrai si votre «table» est en réalité une vue ou une requête complexe.


0 commentaires