1
votes

Compter la valeur sur plusieurs colonnes

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 >


5 commentaires

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


4 Réponses :


1
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

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


2 commentaires

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.



0
votes

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;


1 commentaires

intéressant. va vérifier cela. c'est dans sqlserver 16