group by un poil compliqué

Le
Etienne SOBOLE
salut.

j'ai dans une base de données des produits qui ont une marque.
il y a 4 marques principales et tout plein de petites marques

pour faire simple je cherche a faire un
select marque, count(*) from produit group by marque

sauf que j'ai besoin de grouper toutes les petites marque entre elles.

en gros j'aimerai n'avoir que 5 lignes en retour avec:
m1, 234
m2, 333
m3, 543
m4, 541
autre, 246

ou autre serait le regroupement de toutes les marques qui ne sont pas m1,
m2, m3 ou m4

c'est possible de faire ca en SQL ???
voila merci.

Etienne
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
ALain Montfranc
Le #21852431
Etienne SOBOLE a écrit
salut.

j'ai dans une base de données des produits qui ont une marque.
il y a 4 marques principales et tout plein de petites marques

pour faire simple je cherche a faire un
select marque, count(*) from produit group by marque

sauf que j'ai besoin de grouper toutes les petites marque entre elles.

en gros j'aimerai n'avoir que 5 lignes en retour avec:
m1, 234
m2, 333
m3, 543
m4, 541
autre, 246

ou autre serait le regroupement de toutes les marques qui ne sont pas m1, m2,
m3 ou m4

c'est possible de faire ca en SQL ???
voila merci.

Etienne



Sous postgresql avec un case et un subselect

select marque, count(*) from (select case when marque = 'm1 or marque =
'm2' ... then marque else 'autre' end from table) group by marque

(non testé, de tête)

ou alors

select marque, count(*) from table where marque in ( 'm1', 'm2', 'm3',
'm4' ) group by marque
union
select 'autre', count(*) from table where marque not in ( 'm1', 'm2',
'm3', 'm4' ) group by marque
Eric Rossé
Le #21852421
Le Wed, 20 Jun 2007 12:19:25 +0200, Etienne SOBOLE écrivait:

salut.

j'ai dans une base de données des produits qui ont une marque.
il y a 4 marques principales et tout plein de petites marques

pour faire simple je cherche a faire un
select marque, count(*) from produit group by marque

sauf que j'ai besoin de grouper toutes les petites marque entre elles.

en gros j'aimerai n'avoir que 5 lignes en retour avec:
m1, 234
m2, 333
m3, 543
m4, 541
autre, 246

ou autre serait le regroupement de toutes les marques qui ne sont pas m1,
m2, m3 ou m4

c'est possible de faire ca en SQL ???



Oui.

select marque,count(*) from produit
where marque in ('m1','m2','m3','m4')
group by 1
union
select 'autre',count(*) from produit
where marque not in ('m1','m2','m3','m4')
group by 1

Et avec une table marque qui précise pour chaque marque celle
qui est principale et celle qui ne l'est pas, c'est encore plus
simple.
Lionel
Le #21852411
Etienne SOBOLE wrote:
salut.

j'ai dans une base de données des produits qui ont une marque.
il y a 4 marques principales et tout plein de petites marques

pour faire simple je cherche a faire un
select marque, count(*) from produit group by marque

sauf que j'ai besoin de grouper toutes les petites marque entre elles.

en gros j'aimerai n'avoir que 5 lignes en retour avec:
m1, 234
m2, 333
m3, 543
m4, 541
autre, 246




Rajoute une colonne marque_bilan sur ta table des marque et ta requete
devient:
select marque_bilan, count(*) from produit group by marque_bilan
Etienne SOBOLE
Le #21852391
select marque,count(*) from produit
where marque in ('m1','m2','m3','m4')
group by 1
union
select 'autre',count(*) from produit
where marque not in ('m1','m2','m3','m4')
group by 1

Et avec une table marque qui précise pour chaque marque celle
qui est principale et celle qui ne l'est pas, c'est encore plus
simple.



oui effectivement j'ai cette information.
en quoi cela peut simplifier ou accelerer la requete!

merci.
Etienne SOBOLE
Le #21852381
select marque, count(*) from (select case when marque = 'm1 or marque =
'm2' ... then marque else 'autre' end from table) group by marque

ou alors

select marque, count(*) from table where marque in ( 'm1', 'm2', 'm3',
'm4' ) group by marque
union
select 'autre', count(*) from table where marque not in ( 'm1', 'm2',
'm3', 'm4' ) group by marque



merci j'essaye tout ca !
Etienne
Eric Rossé
Le #21852371
Le Sat, 23 Jun 2007 10:06:37 +0200, Etienne SOBOLE écrivait:

select marque,count(*) from produit
where marque in ('m1','m2','m3','m4')
group by 1
union
select 'autre',count(*) from produit
where marque not in ('m1','m2','m3','m4')
group by 1

Et avec une table marque qui précise pour chaque marque celle
qui est principale et celle qui ne l'est pas, c'est encore plus
simple.



oui effectivement j'ai cette information.
en quoi cela peut simplifier ou accelerer la requete!



J'aurai dû dire générique et non simple... et je n'ai pas
parlé performances:

select m.lib_marque,count(*) from produit p,marque m
where p.code_marque = m.code_marque
and m.type_marque = '1'
group by 1
union
select 'autre',count(*) from produit p,marque m
where p.code_marque = m.code_marque
and m.type_marque = '0'
group by 1

avec
type_marque = '1' : marque principale
type_marque = '0' : autre marque
Fred Brouard - SQLpro
Le #21843551
Plus simple :

select m.lib_marque,
SUM(CASE m.type_marque = '1' THEN 1
CASE m.type_marque = '0' THEN 1 END) AS NOMBRE
from produit p
INNER JOIN marque m
ON p.code_marque = m.code_marque
group by m.lib_marque

A +

Etienne SOBOLE a écrit :
salut.

j'ai dans une base de données des produits qui ont une marque.
il y a 4 marques principales et tout plein de petites marques

pour faire simple je cherche a faire un
select marque, count(*) from produit group by marque

sauf que j'ai besoin de grouper toutes les petites marque entre elles.

en gros j'aimerai n'avoir que 5 lignes en retour avec:
m1, 234
m2, 333
m3, 543
m4, 541
autre, 246

ou autre serait le regroupement de toutes les marques qui ne sont pas m1,
m2, m3 ou m4

c'est possible de faire ca en SQL ???
voila merci.

Etienne






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
ALain Montfranc
Le #21843531
Fred Brouard - SQLpro a écrit
Plus simple :

select m.lib_marque,
SUM(CASE m.type_marque = '1' THEN 1
CASE m.type_marque = '0' THEN 1 END) AS NOMBRE
from produit p
INNER JOIN marque m
ON p.code_marque = m.code_marque
group by m.lib_marque



Ca serait pas plutot un truc du genre

select CASE m.type_marque = '1' THEN m.lib_marque
CASE m.type_marque = '0' THEN 'Autres' END,
SUM(1) AS NOMBRE
from produit p
INNER JOIN marque m
ON p.code_marque = m.code_marque
group CASE m.type_marque = '1' THEN m.lib_marque
CASE m.type_marque = '0' THEN 1 END



e


Fred Brouard - SQLpro
Le #21843511
ALain Montfranc a écrit :
Fred Brouard - SQLpro a écrit
Plus simple :

select m.lib_marque,
SUM(CASE m.type_marque = '1' THEN 1
CASE m.type_marque = '0' THEN 1 END) AS NOMBRE
from produit p
INNER JOIN marque m
ON p.code_marque = m.code_marque
group by m.lib_marque



Ca serait pas plutot un truc du genre

select CASE m.type_marque = '1' THEN m.lib_marque
CASE m.type_marque = '0' THEN 'Autres' END,
SUM(1) AS NOMBRE
from produit p
INNER JOIN marque m
ON p.code_marque = m.code_marque
group CASE m.type_marque = '1' THEN m.lib_marque
CASE m.type_marque = '0' THEN 1 END



e










donnez moi un jeu d'essai et la réaponse que vous attendez !

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Publicité
Poster une réponse
Anonyme