2013-07-23 2 views
1

J'ai une table qui ressemble à
Combinant lignes et prenant des moyennes

#Sector max1 avg1 max2 avg2 numb 
C   133 14  45 3  27 
N   174  9  77 3  18 
M   63  3  28 1  16 

Je voudrais joindre les lignes N et M convoquent ce X et prennent la valeur maximum de max1 et max2 tout en prenant le avg de AVG1, avg2 et engourdis dans leurs colonnes respectives pour retourner

#Sector max1 avg1 max2 avg2 numb 
C   133 14  45 3  27 
X   174  6  77 2  17 

Répondre

3

Essayez de cette façon:

select sector, max1,avg1,max2,avg2,numb 
from tab 
where sector not in ('M','N') 
union all 
select 'X' as sector, max(max1),avg(avg1),max(max2),avg(avg2),avg(numb) 
from tab 
where sector in ('M','N') 
+0

Nécessité d'UNION le record de 'C' ou refactoring pour mettre le' IN' dans GROUP BY plutôt que la clause WHERE. – MatBailie

+0

OP veut que la ligne ** C ** reste dans le résultat. –

+0

@MatBailie Merci! J'ai modifié la réponse – Parado

2

quelque chose comme:

select 
    case when sector in ('N','M') then 'X' else sector end sect, 
    max(max1) max1, 
    avg(avg1) avg1, 
    max(max2) max2, 
    avg(avg2) avg2, 
    avg(numb) numb 
from tabname 
group by 
    case when sector in ('N','M') then 'X' else sector end 
+0

Ne pourriez-vous pas 'GROUP BY sect'? –

+0

http://stackoverflow.com/questions/3841295/sql-using-alias-in-group-by –

+0

Ah ah. Merci - J'utilise PostgreSQL depuis un an, donc mes learnins MSSQL commencent à s'estomper. Donc, GROUP BY 1 (pile de colonnes) serait également possible, mais sujettes à des problèmes plus tard si la requête est modifiée et que les colonnes retournées sont déplacées ... –