Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

group by un poil compliqué

9 réponses
Avatar
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

9 réponses

Avatar
ALain Montfranc
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
Avatar
Eric Rossé
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.
Avatar
Lionel
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
Avatar
Etienne SOBOLE
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.
Avatar
Etienne SOBOLE
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
Avatar
Eric Rossé
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
Avatar
Fred Brouard - SQLpro
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 ***********************
Avatar
ALain Montfranc
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

Avatar
Fred Brouard - SQLpro
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 ***********************