2017-04-20 2 views
-1

J'ai la table db suivante et je voudrais compter et grouper par couleur. Je suis un étudiant de première année et un débutant de SQL. Quelqu'un peut-il enseigner avec le code?Fonction SQL Group By et Count

SQL-CountColor:

SQL-CountColor

Ce que j'ai essayé:

Select COLOR, 
    sum(case when Blue = 1 then 1 else 0 end) as Blue_count, 
    sum(case when Red then 1 else 0 end) as Red_count, 
    sum(case when Yellow then 1 else 0 end) as Yellow_count, 
    sum(case when Black then 1 else 0 end) as Black_count, 
    sum(case when Green then 1 else 0 end) as Green_count, 
from TAB_GROUP 
group by COLOR; 
+1

Avez-vous essayé quoi que ce soit? – Milney

+1

Ce n'est pas comme ça que fonctionne StackOverflow, et laissez-moi vous dire que ce n'est pas comme ça que vous apprendrez le SQL (ou quoi que ce soit d'autre). Des questions comme celle-ci ont déjà été posées plusieurs fois sur plusieurs sites (SO inclus), tout ce que vous avez à faire est un peu de recherche. Si après cela, vous ne parvenez toujours pas à résoudre ce problème, revenez ici et postez une question décrivant ce que vous avez essayé et ce qui ne va pas, et vous trouverez de l'aide. Mots-clés tip: recherche "group by", "count", "case", "pivot" et vous pouvez trouver des ressources intéressantes. –

+0

Désolé, j'ai oublié de poster ce que j'ai essayé – DerrickWong

Répondre

0

Le problème avec votre requête est que vous mélangez deux approches, à la fois valides mais ne sont pas compatibles.

La première utilise une instruction case, comme @LONG l'a fait dans sa réponse, et c'est bien, mais elle ne nécessite pas group by; vous êtes déjà groupé "artificiellement" en donnant des conditions différentes dans chaque colonne;

select sum(case when Blue = 1 then 1 else 0 end) as Blue_count, 
     sum(case when Red then 1 else 0 end) as Red_count, 
     sum(case when Yellow then 1 else 0 end) as Yellow_count, 
     sum(case when Black then 1 else 0 end) as Black_count, 
     sum(case when Green then 1 else 0 end) as Green_count 
from TAB_GROUP 

L'autre approche utilise un group by, et il est bien aussi, mais vous ne devez compter les lignes pour chaque groupe

select COLOR, count(*) as CNT 
from TAB_GROUP 
group by COLOR 

Cela vous donnera un résultat qui est le même comme celle souhaitée, mais avec des lignes et des colonnes inversées

COLOR | CNT 
Blue | 2 
Red | 2 
Yellow | 1 
Black | 1 
Green | 1 

pour déplacer des lignes à colonnes dont vous auriez besoin d'une fonction pivotante, dont la syntaxe peut varier en fonction de la base de données que vous êtes usin g. Cela rend cette approche plus complexe, mais aussi plus polyvalente dans le cas où le nombre de valeurs possibles augmente.

0
select  sum(case when color = 'blue' then 1 else 0 end) as 'Blue', 
      sum(case when color = 'red' then 1 else 0 end) as 'Red', 
      sum(case when color = 'yellow' then 1 else 0 end) as 'Yellow', 
      sum(case when color = 'Black' then 1 else 0 end) as 'Black', 
      sum(case when color = 'Green' then 1 else 0 end) as 'Green' 
From Table 
+1

semble que vous êtes vraiment pressé de répondre ... – Rahul

+0

@Rahul, pas vraiment, répondu sur mon téléphone en fait. – LONG

1

Vous devriez avoir cherché un peu, il est une instruction SQL très courante.

select COLOR, count(*) from TAB_GROUP group by COLOR 
0

Votre requête est fondamentalement correcte. Tout ce que vous devez faire est de retirer le GROUP BY et fixer le case de se référer aux colonnes de vos données:

select sum(case when color = 'Blue' then 1 else 0 end) as Blue_count, 
     sum(case when color = 'Red' then 1 else 0 end) as Red_count, 
     sum(case when color = 'Yellow' then 1 else 0 end) as Yellow_count, 
     sum(case when color = 'Black' then 1 else 0 end) as Black_count, 
     sum(case when color = 'Green' then 1 else 0 end) as Green_count 
from TAB_GROUP;