2016-09-29 1 views
2

J'ai une table comme ces 3 colonnes: col1, col2, col3requête SQL pour transposer certaines colonnes

Je dois regrouper ces trois colonnes et de calculer le nombre. J'ai terminé le groupe par comme ci-dessous:

select col5,col3,col2, count(*) from mytable group by col5,col3,col2 

COL5 COL3 COL2 COUNT(*) 
MOVIL A  PRE  81.00 
MOVIL B  COM  466.00 
MOVIL A  COM  947.00 

Il y a seulement deux valeurs possibles est dans col2 qui sont PRE et COM Mais ce que je besoin est un petit changement comme ci-dessous:

COL5 COL3 PRE COM 
MOVIL A  81  947 
MOVIL B  NULL 466 

I crois que PIVOT devrait être utilisé pour cela. Mais je ne suis pas un expert en SQL. Quelqu'un pourrait-il m'aider?

+0

Pouvez-vous fournir des données de test avec plus de cas? Peut être plusieurs 'PRE' et 'COM' sur un seul COL5 COL3? –

Répondre

2

Vous pouvez utiliser PIVOT comme ça (je pense col2 est d'avoir seulement deux valeurs et non col3):

SELECT * 
FROM (select col5,col3,col2, count(*) from mytable group by col5,col3,col2) 
PIVOT(MAX(CNT) FOR COL2 IN ('PRE','COM')); 
+0

J'accepte cette réponse car j'aime cette solution plus même si la solution de stan est bonne pour moi. – Vijay

1
select 
    col5, 
    col3, 
    SUM(CASE WHEN col2='PRE' THEN count ELSE 0 END) as PRE, 
    SUM(CASE WHEN col2='COM' THEN count ELSE 0 END) as COM 
FROM (select col5,col3,col2, count(*) as count 
     from mytable group by col5,col3,col2) as sub 
GROUP BY col5, col3 

Comme ça?

+0

Pas très instructif. Qu'est-ce qui ne fonctionne pas exactement? – StanislavL

+0

Désolé pour le commentaire précédent. Cela fonctionne parfaitement. Merci beaucoup Stan – Vijay

+0

@StanislavL: Je suppose qu'il n'y a pas besoin de "as" mot-clé tout en fournissant un alias à une vue en ligne. – hemalp108

0

En utilisant Pivot:

  select col5 ,col3,[PRE],[COM] 
      from 
      (
      select col5,col3,col2, count(*) as count 
        from #Mytable group by col5,col3,col2 
        )c 
      pivot 
      (
      max(count) 
        FOR col2 IN ([com],[pre]) 
      )as p 

si vous avez des inquiétudes me le faire savoir.