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

QUESTION PIVOT OU ???

8 réponses
Avatar
christophe
Bonjour,

voila j'ai une problematique et j'ai du mal a voir comment je peux faire
cela avec des group by et peut etre la fonction pivot ????


j'ai une table avec 2 cles,
ou la cle_A represente des personnes et la cle_B des enseignes à laquelle
elles appartiennent !
bien sur une cle_A peut se retrouver avec plusieurs enseignes (cle_b)

et justement on me demande de sortir des stats du style
je veux avoir le compte des individus pour la CLE_B valeur 1, combien de ces
individus sont aussi present dans la CLE_B valeur 2, combien dans la CLe_B
valeur 3 etc...

en gros pour l'enseigne A combien de personne se retrouve aussi dans les
autres enseignes etc...
pour l'exemple la CLe_A valeur 1 se retrouve dans 3 enseignes de la CLe_B


donc pour la CLe_B valeur 2 combien y'en a t'il en valeur 1 ou autre ???


CLE_A | CLE_B
1 1
1 2
1 3
2 1
2 4
3 1
4 3




j'espere que j'ai été clair, car je doute ;)

8 réponses

Avatar
Fred BROUARD
non, vous n'avez pas été clair et si vous doutez c'est que vous ne
comprennez pas non plus clairement votre problème.

Soyez précis, clair, complet... donc efficace. Postez la réponse
attendue par rapport à vos données.

Soyez gentil (pour ne pas dire poli) et donnez le DDL de vos tables et
les ordres d'insertion pour que chacun puisse reproduire le problème
chez lui pour vous aider !

A +

christophe a écrit :
Bonjour,

voila j'ai une problematique et j'ai du mal a voir comment je peux faire
cela avec des group by et peut etre la fonction pivot ????


j'ai une table avec 2 cles,
ou la cle_A represente des personnes et la cle_B des enseignes à
laquelle elles appartiennent !
bien sur une cle_A peut se retrouver avec plusieurs enseignes (cle_b)

et justement on me demande de sortir des stats du style
je veux avoir le compte des individus pour la CLE_B valeur 1, combien de
ces individus sont aussi present dans la CLE_B valeur 2, combien dans la
CLe_B valeur 3 etc...

en gros pour l'enseigne A combien de personne se retrouve aussi dans les
autres enseignes etc...
pour l'exemple la CLe_A valeur 1 se retrouve dans 3 enseignes de la CLe_B


donc pour la CLe_B valeur 2 combien y'en a t'il en valeur 1 ou autre ???


CLE_A | CLE_B
1 1
1 2
1 3
2 1
2 4
3 1
4 3




j'espere que j'ai été clair, car je doute ;)





--
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.sqlspot.com *************************
Avatar
christophe
oui fred désolé la précipitation,
alors voila un exemple qui va formaliser le tout !
avec les questions !

CREATE TABLE #TOTO (ID INT IDENTITY(1,1), CLE_SP BIGINT, CLE_ENSEIGNES INT)

INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (1, 1)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (1, 2)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (1, 3)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (2, 1)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (2, 3)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (3, 1)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (3, 2)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (3, 3)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (4, 3)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (5, 3)



SELECT CLE_ENSEIGNES, COUNT(*) AS NB FROM #TOTO GROUP BY CLE_ENSEIGNES
--alors ici nous avons un comptage par enseigne

/*
hos ce que j'aimerais faire c'est un comptage par enseigne dont les
individus peut etre contenu dans d'autre enseigne.
exemple pour l'enseigne 1

donc je reprend l'exemple de l'enseigne 1 elle contient 3 individus comme le
montre le comptage
et ces 3 memes individus sont eux aussi present 2 dans l'eneigne N°2 et
enfin egalement 3 dans l'enseigne N°3

on voit bien que sont absent les mecs 4 et 5 car non present dans l'enseigne
1
et hop on passe à la 2 et rebelotte.


*/


--biensur cette est ecrite en dur mais le but de la demande c'est de pouvoir
etre dynamique car le nombre d'enseigne peut changer.
--ainsi que l'appartenance des individus à differentes enseiges.
SELECT SUM(e1) AS T1, SUM(e2) AS T2, SUM(e3) AS T3
FROM (
SELECT
CASE WHEN CLE_ENSEIGNES = 1 THEN 1 ELSE 0 END AS E1,
CASE WHEN CLE_ENSEIGNES = 2 THEN 1 ELSE 0 END AS E2,
CASE WHEN CLE_ENSEIGNES = 3 THEN 1 ELSE 0 END AS E3
FROM #TOTO
WHERE CLE_SP IN ( SELECT CLE_SP FROM #TOTO WHERE CLE_ENSEIGNES = 1)
) Z





"Fred BROUARD" a écrit dans le message de
news:eS$
non, vous n'avez pas été clair et si vous doutez c'est que vous ne
comprennez pas non plus clairement votre problème.

Soyez précis, clair, complet... donc efficace. Postez la réponse attendue
par rapport à vos données.

Soyez gentil (pour ne pas dire poli) et donnez le DDL de vos tables et les
ordres d'insertion pour que chacun puisse reproduire le problème chez lui
pour vous aider !

A +

christophe a écrit :
Bonjour,

voila j'ai une problematique et j'ai du mal a voir comment je peux faire
cela avec des group by et peut etre la fonction pivot ????


j'ai une table avec 2 cles,
ou la cle_A represente des personnes et la cle_B des enseignes à laquelle
elles appartiennent !
bien sur une cle_A peut se retrouver avec plusieurs enseignes (cle_b)

et justement on me demande de sortir des stats du style
je veux avoir le compte des individus pour la CLE_B valeur 1, combien de
ces individus sont aussi present dans la CLE_B valeur 2, combien dans la
CLe_B valeur 3 etc...

en gros pour l'enseigne A combien de personne se retrouve aussi dans les
autres enseignes etc...
pour l'exemple la CLe_A valeur 1 se retrouve dans 3 enseignes de la CLe_B


donc pour la CLe_B valeur 2 combien y'en a t'il en valeur 1 ou autre ???


CLE_A | CLE_B
1 1
1 2
1 3
2 1
2 4
3 1
4 3




j'espere que j'ai été clair, car je doute ;)





--
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.sqlspot.com *************************


Avatar
Christophe Lephay
"christophe" a écrit dans le message de news:

oui fred désolé la précipitation,
alors voila un exemple qui va formaliser le tout !
avec les questions !

CREATE TABLE #TOTO (ID INT IDENTITY(1,1), CLE_SP BIGINT, CLE_ENSEIGNES
INT)

INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (1, 1)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (1, 2)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (1, 3)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (2, 1)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (2, 3)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (3, 1)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (3, 2)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (3, 3)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (4, 3)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (5, 3)



SELECT CLE_ENSEIGNES, COUNT(*) AS NB FROM #TOTO GROUP BY CLE_ENSEIGNES
--alors ici nous avons un comptage par enseigne

/*
hos ce que j'aimerais faire c'est un comptage par enseigne dont les
individus peut etre contenu dans d'autre enseigne.
exemple pour l'enseigne 1



select cle_enseignes, count(*) as nb from #toto group by cle_enseignes
where cle_sp in (select cle_sp, count(*) as nb from #toto group by cle_sp
having nb > 1)

J'ai pas testé, mais ça doit être un truc comme ça.
Avatar
Christophe Lephay
"Christophe Lephay" a écrit dans le message
de news: 472f4d6d$0$5090$
select cle_enseignes, count(*) as nb from #toto group by cle_enseignes
where cle_sp in (select cle_sp, count(*) as nb from #toto group by cle_sp
having nb > 1)



Ou peut-être ça, plutôt :

select cle_enseignes, count(*) as nb from #toto
where cle_sp in
(select cle_sp from #toto group by cle_sp having count(*) > 1)
group by cle_enseignes
Avatar
christophe
Merci christophe,

mais ton cas ne les couvre pas tous !
je n'ai que les cas qui sont dans plusieures enseignes hors ils me faut quoi
qu'il arrivent toutes les enseignes.

j'ai une piste qui donne de bons resultats mais je n'aime pas beaucoups le
code que j'ai fait !


"Christophe Lephay" a écrit dans le message
de news:472f5101$0$25928$
"Christophe Lephay" a écrit dans le message
de news: 472f4d6d$0$5090$
select cle_enseignes, count(*) as nb from #toto group by cle_enseignes
where cle_sp in (select cle_sp, count(*) as nb from #toto group by cle_sp
having nb > 1)



Ou peut-être ça, plutôt :

select cle_enseignes, count(*) as nb from #toto
where cle_sp in
(select cle_sp from #toto group by cle_sp having count(*) > 1)
group by cle_enseignes




Avatar
Christophe Lephay
"christophe" a écrit dans le message de news:

mais ton cas ne les couvre pas tous !
je n'ai que les cas qui sont dans plusieures enseignes hors ils me faut
quoi qu'il arrivent toutes les enseignes.

j'ai une piste qui donne de bons resultats mais je n'aime pas beaucoups le
code que j'ai fait !


"Christophe Lephay" a écrit dans le message
de news:472f5101$0$25928$
select cle_enseignes, count(*) as nb from #toto
where cle_sp in
(select cle_sp from #toto group by cle_sp having count(*) > 1)
group by cle_enseignes





Ok :

select toto1.cle_enseignes, nb from #toto toto1
left join (select cle_enseignes, count(*) as nb from #toto
where cle_sp in
(select cle_sp from #toto group by cle_sp having count(*) > 1)
group by cle_enseignes) toto2
on toto1.cle_enseignes = toto2.cle_enseignes

Une fois encore, j'ai pas testé...
Avatar
Christophe Lephay
"Christophe Lephay" a écrit dans le message
de news: 472f607f$0$27399$
"christophe" a écrit dans le message de news:

mais ton cas ne les couvre pas tous !
je n'ai que les cas qui sont dans plusieures enseignes hors ils me faut
quoi qu'il arrivent toutes les enseignes.

j'ai une piste qui donne de bons resultats mais je n'aime pas beaucoups
le code que j'ai fait !


"Christophe Lephay" a écrit dans le
message de news:472f5101$0$25928$
select cle_enseignes, count(*) as nb from #toto
where cle_sp in
(select cle_sp from #toto group by cle_sp having count(*) > 1)
group by cle_enseignes





Ok :

select toto1.cle_enseignes, nb from #toto toto1
left join (select cle_enseignes, count(*) as nb from #toto
where cle_sp in
(select cle_sp from #toto group by cle_sp having count(*) > 1)
group by cle_enseignes) toto2
on toto1.cle_enseignes = toto2.cle_enseignes

Une fois encore, j'ai pas testé...



PS : essaie de répondre en fin de message plutôt qu'au début, ça devient
vite illisible sinon au fur et à mesure que se poursuit l'échange.
Avatar
christophe
voila un exemple avec le resultat attendu, comment le rendre plus corporate
car si j'ai des nouvelles enseignes faut refaire les requetes !




CREATE TABLE #TOTO (ID INT IDENTITY(1,1), CLE_SP BIGINT, CLE_ENSEIGNES INT)

INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (1, 1)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (1, 2)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (1, 3)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (2, 1)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (2, 3)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (3, 1)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (3, 2)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (3, 3)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (4, 3)
INSERT INTO #TOTO (CLE_SP, CLE_ENSEIGNES) VALUES (5, 3)



SELECT SUM(e1) AS T1, SUM(e2) AS T2, SUM(e3) AS T3
FROM (
SELECT
CASE WHEN CLE_ENSEIGNES = 1 THEN 1 ELSE 0 END AS E1,
CASE WHEN CLE_ENSEIGNES = 2 THEN 1 ELSE 0 END AS E2,
CASE WHEN CLE_ENSEIGNES = 3 THEN 1 ELSE 0 END AS E3
FROM #TOTO
WHERE CLE_SP IN ( SELECT CLE_SP FROM #TOTO WHERE CLE_ENSEIGNES = 1)
) Z
UNION all
SELECT SUM(e1) AS T1, SUM(e2) AS T2, SUM(e3) AS T3
FROM (
SELECT
CASE WHEN CLE_ENSEIGNES = 1 THEN 1 ELSE 0 END AS E1,
CASE WHEN CLE_ENSEIGNES = 2 THEN 1 ELSE 0 END AS E2,
CASE WHEN CLE_ENSEIGNES = 3 THEN 1 ELSE 0 END AS E3
FROM #TOTO
WHERE CLE_SP IN ( SELECT CLE_SP FROM #TOTO WHERE CLE_ENSEIGNES = 2)
) Z
UNION all
SELECT SUM(e1) AS T1, SUM(e2) AS T2, SUM(e3) AS T3
FROM (
SELECT
CASE WHEN CLE_ENSEIGNES = 1 THEN 1 ELSE 0 END AS E1,
CASE WHEN CLE_ENSEIGNES = 2 THEN 1 ELSE 0 END AS E2,
CASE WHEN CLE_ENSEIGNES = 3 THEN 1 ELSE 0 END AS E3
FROM #TOTO
WHERE CLE_SP IN ( SELECT CLE_SP FROM #TOTO WHERE CLE_ENSEIGNES = 3)
) Z


DROP TABLE #TOTO