2010-03-19 5 views
0
select count(a),b,c 
from APPLE 
    join MANGO on (APPLE.link=MANGO.link) 
    join ORANGE on (APPLE.link=ORANGE.link) 
where id='camel' 
group by b,c; 

Le b de la colonne donne des valeurs telles queComment combiner la version connexe dans le groupe par

1.0 
1.0,R 
1.0,B 
2.0 
2.0,B 
2.0,R 
3.0,C 
3.0,R 

est-il possible de modifier la requête ci-dessus de telle sorte que tous les 1,0 et 1,0, R et 1,0, B est fusionné comme 1.0, et 2.0,2.0, B sont fusionnés comme 2.0 et de la même manière pour 3.0 et 4.0?

Répondre

1
SELECT COUNT(a), REGEXP_REPLACE(b, '([0-9]*\.[0-9]*)(.*)', '\1') b, c 
FROM apple 
JOIN mango 
ON  mango.link = apple.link 
JOIN orange 
ON  orange.link = apple.link 
WHERE id = 'camel' 
GROUP BY 
     REGEXP_REPLACE(b, '([0-9]*\.[0-9]*)(.*)', '\1'), c 
+0

i get ora-00904: identificateur non valide erreur pour regexp_replace dans le groupe par, son fonctionnement bien dans la ligne fisrt c'est à dire, sélectionnez – randeepsp

+0

@randeepsp: quelle version 'Oracle' utilisez-vous? – Quassnoi

+0

J'utilise Oracle 9.2.2 – randeepsp

1

vous pouvez utiliser substr si vous n'avez pas accès à regexp_replace (10g +). Si vous avez seulement d'agréger 1.0-4.0:

SELECT COUNT(a), substr(b, 1, 3), c 
    FROM APPLE 
    JOIN MANGO ON (APPLE.link = MANGO.link) 
    JOIN ORANGE ON (APPLE.link = ORANGE.link) 
WHERE id = 'camel' 
GROUP BY substr(b, 1, 3), c; 

Si vous prévoyez vous pouvez atteindre 10.0 vous pouvez utiliser instr pour obtenir le nombre de caractères:

SELECT COUNT(a), 
     CASE 
      WHEN instr(b, ',') > 0 THEN 
      substr(b, 1, instr(b, ',') - 1) 
      ELSE 
      b 
     END, c 
    FROM APPLE 
    JOIN MANGO ON (APPLE.link = MANGO.link) 
    JOIN ORANGE ON (APPLE.link = ORANGE.link) 
WHERE id = 'camel' 
GROUP BY CASE 
      WHEN instr(b, ',') > 0 THEN 
       substr(b, 1, instr(b, ',') - 1) 
      ELSE 
       b 
      END, c; 
Questions connexes