Somme ou nombre de valeurs basé sur 2 colonnes avec les mêmes valeurs dans le server SQL

J'ai une table DB qui a des colonnes nommées avec quelques autres colonnes

ColorA ColorB Status 

Les données de cette database ressemblent à ceci.

 ColorA ColorB Status --------- --------- --------- GREEN NULL YES GREEN NULL YES RED GREEN NO RED GREEN YES 

Le résultat que je veux est quelque chose comme ceci en fonction de Statut = 'OUI'

 Color Count GREEN 3 RED 1 

J'ai aussi défini une table qui contient toute la couleur.

Comment build la requête SQL pour cela qui résultera dans la sortie comme mentionné précédemment? J'ai une requête, mais j'utilise LEFT Join, puis je fais un UNION qui ne donne pas de résultat correct.

Cela devrait fonctionner:

 SELECT a.color, Count(a.color) AS Count FROM (SELECT colora AS color FROM table1 WHERE status = 'YES' AND colora IS NOT NULL UNION ALL SELECT colorb FROM table1 WHERE status = 'YES' AND colorb IS NOT NULL) a GROUP BY a.color 

Résultat

  |  COULEUR |  COUNT |
 -----------------
 |  VERT |  3 |
 |  ROUGE |  1 | 

Voir la démo

Dans l'exemple que vous avez donné, vous voulez connaître le nombre de chaque logging ColorA ou ColorB

 SELECT Color, SUM(Total) AS Count FROM ( SELECT ColorA as Color, SUM(CASE WHEN Status = 'Yes' THEN 1 ELSE 0 END) AS Total Group By ColorA UNION SELECT ColorB as Color, SUM(CASE WHEN Status = 'Yes' THEN 1 ELSE 0 END) AS Total Group By ColorB ) U GROUP BY Color 

Cela fonctionne dans SQL Server, MySQL et PostgreSQL ( démo SQLFiddle ):

 SELECT color, sum(cnt) AS count FROM ( SELECT colorA AS color, count(*) AS cnt FROM mytable WHERE status = 'YES' GROUP BY colorA UNION ALL SELECT colorB AS color, count(*) AS cnt FROM mytable WHERE status = 'YES' GROUP BY colorB ) AS x WHERE color IS NOT NULL GROUP BY color