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.
3 Réponses :
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
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 .
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.
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)
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.
UNION TOUS 5 fois, GROUP BY le résultat.