2009-10-19 23 views
0

J'ai une vue en SQL que j'ai générée en analysant les valeurs dans les tables afin que ce champ contienne la valeur 'N', 'D' ou 'V'. Je peux calculer les totaux par colonne mais pas par rangée ... Est-ce possible?Pivot/unpivot dans SQL

Exemple:

données

No, Col_1, Col_2, Col_3 

1,  N,  N,  N 

2,  N,  D,  D 

3,  N,  V,  D 

4,  V,  V,  V 

Comment puis-je summise que la ligne 3 a 1 N, 1V et 3ds tandis que la ligne 4 a 4Vs? Parier est assez simple mais malheureusement je le suis aussi!

Un grand merci à l'avance, Peter

Répondre

0
select case when col_1 = 'N' then 1 else 0 end as n_count from tablename; 

Généraliser que:

select 
    case when col_1 = 'N' then 1 else 0 end 
    + case when col_2 = 'N' then 1 else 0 end 
    + case when col_2 = 'N' then 1 else 0 end as n_count, 
    case when col_1 = 'V' then 1 else 0 end 
    + case when col_2 = 'V' then 1 else 0 end 
    + case when col_2 = 'V' then 1 else 0 end as v_count, 
    .... 
    from tablename; 
+0

À moins que le nombre de colonnes sont dynamiques ... alors vous faites une PIVOT –

+0

@ d03boy: syntaxe PIVOT est prise en charge uniquement sur SQL Server 11g et Oracle + 2005+ que je suis au courant. Et à mon humble avis, les instructions CASE sont plus faciles à générer dynamiquement. –

0

Que diriez-vous?

select no, 
sum(case when val = 'N' then 1 else 0 end) ncnt, 
sum(case when val = 'V' then 1 else 0 end) vcnt, 
sum(case when val = 'D' then 1 else 0 end) dcnt from 
(select no, col_1 val from t union all 
select no, col_2 from t union all 
select no, col_3 from t) 
group by no 
order by no