Je cherche à compter le nombre de fois qu'un ensemble de valeurs s'est produit dans une table. Ces valeurs peuvent apparaître dans jusqu'à 10 colonnes différentes. Je dois incrémenter le nombre indépendamment de la colonne dans laquelle il se trouve. Je sais comment je pourrais compter s'ils étaient tous dans la même colonne mais ne s'étendant pas sur plusieurs colonnes.
Les valeurs peuvent être ajoutées dans n'importe quel ordre. J'en ai environ un millier
63047 1 63048 2
Je voudrais pour cette ligne, je m'attendrais à ce que le résultat
Cpt1 Cpt2 Cpt3 Cpt4 Cpt5 63047 63048 63048 NULL NULL
p >
4 Réponses :
Vous pouvez utiliser un appel union all
pour les traiter comme une seule colonne:
SELECT col, COUNT(*) FROM (SELECT col1 FROM mytable UNION ALL SELECT col2 FROM mytable UNION ALL SELECT col3 FROM mytable -- etc... ) t GROUP BY col
On ne sait pas exactement à quoi ressemble votre table, mais je suppose que ce que vous recherchez est:
SELECT row_count = COUNT(*), row_count_with_given_value = SUM ( CASE WHEN 'myValue' IN (field1, field2, field3, field4) THEN 1 ELSE 0 END) FROM myTable
En supposant les colonnes fieldx
ne sont pas NULL, vous pouvez aussi l'écrire comme ceci:
SELECT row_count = COUNT(*), row_count_with_given_value = SUM ( CASE WHEN field1 = 'myValue' THEN 1 WHEN field2 = 'myValue' THEN 1 WHEN field3 = 'myValue' THEN 1 WHEN field4 = 'myValue' THEN 1 ELSE 0 END) FROM myTable
Quelque chose comme celui-ci pourrait fonctionner (après adaptation à votre domaine de valeur et à vos types de données):
create table t1 (i1 int, i2 int, i3 int); insert into t1 values (1,0,0); insert into t1 values (1,1,1); insert into t1 values (1,0,0); declare @i int = 0; select @i = @i + i1 + i2 + i3 from t1; print @i; drop table t1;
Le résultat est: 5
Vous supposez MySQL ou un autre SGBDR qui prend en charge les affectations en ligne.
@ PM77-1 Je ne suppose pas. La question est étiquetée avec sql-server.
De nombreuses bases de données prennent en charge les jointures latérales, d'un type à l'autre. Ceux-ci peuvent être utilisés pour simplifier cette opération. Utilisation de la syntaxe SQL Server / Oracle 12C:
select v.cpt, count(*) from t cross apply (values (cpt1), (cpt2), . . . ) v(cpt) where cpt is not null group by v.cpt;
intéressant. va vérifier cela. c'est dans sqlserver 16
Veuillez ajouter un exemple des données et une sortie attendue
Très probablement une mauvaise conception de base de données. Êtes-vous sûr que vos données sont correctement normalisées?
Veuillez inclure des exemples de données ainsi que la sortie souhaitée. Deviner un schéma ferait de cette question une course d'idiot
Quelle est la taille de votre table?
la table dans laquelle je lis est probablement 6k lignes avec environ 1k codes différents à regarder