OVH Cloud OVH Cloud

group by et case ...

6 réponses
Avatar
lefevre
bonsoir

dans ma base j'ai

une table societe dans laquelle le niveau_societe indique prospect ou client
une table utilisateurs (commerciaux)
chaque société est affecté à un commercial
une table devis
chaque devis est affecté à un commercial

SELECT case when Table_Societe.Niveau_Societe BETWEEN 1 AND 9 then
COUNT(Table_Devis.Code_Devis) end AS [Qté devis prospect],
case when Table_Societe.Niveau_Societe BETWEEN 10 AND 30
then COUNT(Table_Devis.Code_Devis) end AS [Qté devis Client],
Table_Utilisateur.Prenom_Utilisateur +
' ' + Table_Utilisateur.Nom_Utilisateur AS Commercial
FROM Table_Devis INNER JOIN
Table_Utilisateur ON Table_Devis.Code_Utilisateur =
Table_Utilisateur.Code_Utilisateur INNER JOIN
Table_Personne ON Table_Devis.Code_Personne =
Table_Personne.Code_Personne INNER JOIN
Table_Societe ON Table_Personne.Code_Societe =
Table_Societe.Code_Societe
GROUP BY Table_Utilisateur.Prenom_Utilisateur + ' ' +
Table_Utilisateur.Nom_Utilisateur, Table_Utilisateur.Prenom_Utilisateur
ORDER BY Table_Utilisateur.Prenom_Utilisateur

bien sur la reponse à ma requete est sans appel :
La colonne 'Table_Societe.Niveau_Societe' n'est pas valide dans la liste de
sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou
dans la clause GROUP BY.

donc comment compter le total des devis prospects d'un coté et le total des
devis clients de l'autre regroupé par commercial en sachant que les sociétés
sont dans la meme table ?

je ne sais pas si je suis assez clair ?

merci.

6 réponses

Avatar
Pierre Goiffon
lefevre wrote:
dans ma base j'ai

une table societe dans laquelle le niveau_societe indique prospect ou client
une table utilisateurs (commerciaux)
chaque société est affecté à un commercial
une table devis
chaque devis est affecté à un commercial


(...)
donc comment compter le total des devis prospects d'un coté et le total des
devis clients de l'autre regroupé par commercial en sachant que les sociétés
sont dans la meme table ?



Utiliser 2 fois la table société dans le from ? Une fois pour les
sociétés clientes, une fois pour les sociétés prospects ?
Avatar
lefevre
désolé mais je ne suis pas sur d'avoir bien compris le truc

des precisions ?

merci

Utiliser 2 fois la table société dans le from ? Une fois pour les sociétés
clientes, une fois pour les sociétés prospects ?


Avatar
bruno reiter [MVP]
peut etre qqchose comme :

SELECT COUNT(case when TS.Niveau_Societe BETWEEN 1 AND 9
then TD.Code_Devis end) AS [Qté devis prospect],
COUNT(case when TS.Niveau_Societe BETWEEN 10 AND 30
then TD.Code_Devis) end AS [Qté devis Client],
TU.Prenom_Utilisateur + ' ' + TU.Nom_Utilisateur AS Commercial
FROM Table_Devis TD
INNER JOIN Table_Utilisateur TU
ON TD.Code_Utilisateur = TU.Code_Utilisateur
INNER JOIN Table_Personne TP
ON TD.Code_Personne = TP.Code_Personne
INNER JOIN Table_Societe TS
ON TP.Code_Societe = TS.Code_Societe
GROUP BY TU.Prenom_Utilisateur + ' ' + TU.Nom_Utilisateur
ORDER BY TU.Prenom_Utilisateur




br


"lefevre" wrote in message
news:4276b506$0$8209$
bonsoir

dans ma base j'ai

une table societe dans laquelle le niveau_societe indique prospect ou
client
une table utilisateurs (commerciaux)
chaque société est affecté à un commercial
une table devis
chaque devis est affecté à un commercial

SELECT case when Table_Societe.Niveau_Societe BETWEEN 1 AND 9 then
COUNT(Table_Devis.Code_Devis) end AS [Qté devis prospect],
case when Table_Societe.Niveau_Societe BETWEEN 10 AND 30
then COUNT(Table_Devis.Code_Devis) end AS [Qté devis Client],
Table_Utilisateur.Prenom_Utilisateur +
' ' + Table_Utilisateur.Nom_Utilisateur AS Commercial
FROM Table_Devis INNER JOIN
Table_Utilisateur ON Table_Devis.Code_Utilisateur =
Table_Utilisateur.Code_Utilisateur INNER JOIN
Table_Personne ON Table_Devis.Code_Personne =
Table_Personne.Code_Personne INNER JOIN
Table_Societe ON Table_Personne.Code_Societe =
Table_Societe.Code_Societe
GROUP BY Table_Utilisateur.Prenom_Utilisateur + ' ' +
Table_Utilisateur.Nom_Utilisateur, Table_Utilisateur.Prenom_Utilisateur
ORDER BY Table_Utilisateur.Prenom_Utilisateur

bien sur la reponse à ma requete est sans appel :
La colonne 'Table_Societe.Niveau_Societe' n'est pas valide dans la liste
de sélection parce qu'elle n'est pas contenue dans une fonction
d'agrégation ou dans la clause GROUP BY.

donc comment compter le total des devis prospects d'un coté et le total
des devis clients de l'autre regroupé par commercial en sachant que les
sociétés sont dans la meme table ?

je ne sais pas si je suis assez clair ?

merci.



Avatar
Oxiane
Bonjour,

C'est toujours un peu compliqué de créer des tableaux coisés avec un seul
ordre sql.

Je n'ai pas repris votre modèle, mais l'ordre suivant peut vous metre sur la
voie :


select personne, sum(cpt10) as cpt10,sum(cpt20) as cpt20
from (

select personne, count(niveau) as cpt10 ,0 as cpt20
from com
where niveau between 10 and 19
group by personne

union

select personne, 0 as cpt10, count(niveau) as cpt20
from com
where niveau between 20 and 29
group by personne
) recap

group by personne


Compris l'idée ?


la "ruse" repose sur le

select count(condition1) , 0 where condition1

union

select 0 , count(condition2) , where condition2


et faire un group by




--
Cordialement

Oxiane
----------------------------------------------------------
Omnia vanitas


"lefevre" a écrit dans le message de
news:4276b506$0$8209$
bonsoir

dans ma base j'ai

une table societe dans laquelle le niveau_societe indique prospect ou


client
une table utilisateurs (commerciaux)
chaque société est affecté à un commercial
une table devis
chaque devis est affecté à un commercial

SELECT case when Table_Societe.Niveau_Societe BETWEEN 1 AND 9 then
COUNT(Table_Devis.Code_Devis) end AS [Qté devis prospect],
case when Table_Societe.Niveau_Societe BETWEEN 10 AND


30
then COUNT(Table_Devis.Code_Devis) end AS [Qté devis Client],
Table_Utilisateur.Prenom_Utilisateur


+
' ' + Table_Utilisateur.Nom_Utilisateur AS Commercial
FROM Table_Devis INNER JOIN
Table_Utilisateur ON Table_Devis.Code_Utilisateur > Table_Utilisateur.Code_Utilisateur INNER JOIN
Table_Personne ON Table_Devis.Code_Personne > Table_Personne.Code_Personne INNER JOIN
Table_Societe ON Table_Personne.Code_Societe > Table_Societe.Code_Societe
GROUP BY Table_Utilisateur.Prenom_Utilisateur + ' ' +
Table_Utilisateur.Nom_Utilisateur, Table_Utilisateur.Prenom_Utilisateur
ORDER BY Table_Utilisateur.Prenom_Utilisateur

bien sur la reponse à ma requete est sans appel :
La colonne 'Table_Societe.Niveau_Societe' n'est pas valide dans la liste


de
sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation


ou
dans la clause GROUP BY.

donc comment compter le total des devis prospects d'un coté et le total


des
devis clients de l'autre regroupé par commercial en sachant que les


sociétés
sont dans la meme table ?

je ne sais pas si je suis assez clair ?

merci.




Avatar
bruno reiter [MVP]
un peu vite répondu, peut etre ça :

SELECT SUM(case when TS.Niveau_Societe BETWEEN 1 AND 9
then 1 else 0 end) AS [Qté devis prospect],
SUM(case when TS.Niveau_Societe BETWEEN 10 AND 30
then 1 else 0 end) AS [Qté devis Client],
TU.Prenom_Utilisateur + ' ' + TU.Nom_Utilisateur AS Commercial
FROM Table_Devis TD
INNER JOIN Table_Utilisateur TU
ON TD.Code_Utilisateur = TU.Code_Utilisateur
INNER JOIN Table_Personne TP
ON TD.Code_Personne = TP.Code_Personne
INNER JOIN Table_Societe TS
ON TP.Code_Societe = TS.Code_Societe
GROUP BY TU.Prenom_Utilisateur + ' ' + TU.Nom_Utilisateur
ORDER BY TU.Prenom_Utilisateur

br

"bruno reiter [MVP]" <remove.this! wrote in message
news:
peut etre qqchose comme :

SELECT COUNT(case when TS.Niveau_Societe BETWEEN 1 AND 9
then TD.Code_Devis end) AS [Qté devis prospect],
COUNT(case when TS.Niveau_Societe BETWEEN 10 AND 30
then TD.Code_Devis) end AS [Qté devis Client],
TU.Prenom_Utilisateur + ' ' + TU.Nom_Utilisateur AS Commercial
FROM Table_Devis TD
INNER JOIN Table_Utilisateur TU
ON TD.Code_Utilisateur = TU.Code_Utilisateur
INNER JOIN Table_Personne TP
ON TD.Code_Personne = TP.Code_Personne
INNER JOIN Table_Societe TS
ON TP.Code_Societe = TS.Code_Societe
GROUP BY TU.Prenom_Utilisateur + ' ' + TU.Nom_Utilisateur
ORDER BY TU.Prenom_Utilisateur




br


"lefevre" wrote in message
news:4276b506$0$8209$
bonsoir

dans ma base j'ai

une table societe dans laquelle le niveau_societe indique prospect ou
client
une table utilisateurs (commerciaux)
chaque société est affecté à un commercial
une table devis
chaque devis est affecté à un commercial

SELECT case when Table_Societe.Niveau_Societe BETWEEN 1 AND 9 then
COUNT(Table_Devis.Code_Devis) end AS [Qté devis prospect],
case when Table_Societe.Niveau_Societe BETWEEN 10 AND
30 then COUNT(Table_Devis.Code_Devis) end AS [Qté devis Client],
Table_Utilisateur.Prenom_Utilisateur
+ ' ' + Table_Utilisateur.Nom_Utilisateur AS Commercial
FROM Table_Devis INNER JOIN
Table_Utilisateur ON Table_Devis.Code_Utilisateur =
Table_Utilisateur.Code_Utilisateur INNER JOIN
Table_Personne ON Table_Devis.Code_Personne =
Table_Personne.Code_Personne INNER JOIN
Table_Societe ON Table_Personne.Code_Societe =
Table_Societe.Code_Societe
GROUP BY Table_Utilisateur.Prenom_Utilisateur + ' ' +
Table_Utilisateur.Nom_Utilisateur, Table_Utilisateur.Prenom_Utilisateur
ORDER BY Table_Utilisateur.Prenom_Utilisateur

bien sur la reponse à ma requete est sans appel :
La colonne 'Table_Societe.Niveau_Societe' n'est pas valide dans la liste
de sélection parce qu'elle n'est pas contenue dans une fonction
d'agrégation ou dans la clause GROUP BY.

donc comment compter le total des devis prospects d'un coté et le total
des devis clients de l'autre regroupé par commercial en sachant que les
sociétés sont dans la meme table ?

je ne sais pas si je suis assez clair ?

merci.







Avatar
lefevre
merci, c'est exactement ça


"bruno reiter [MVP]" <remove.this! a écrit dans le message
de news: uYQbHQ$
un peu vite répondu, peut etre ça :

SELECT SUM(case when TS.Niveau_Societe BETWEEN 1 AND 9
then 1 else 0 end) AS [Qté devis prospect],
SUM(case when TS.Niveau_Societe BETWEEN 10 AND 30
then 1 else 0 end) AS [Qté devis Client],
TU.Prenom_Utilisateur + ' ' + TU.Nom_Utilisateur AS Commercial
FROM Table_Devis TD
INNER JOIN Table_Utilisateur TU
ON TD.Code_Utilisateur = TU.Code_Utilisateur
INNER JOIN Table_Personne TP
ON TD.Code_Personne = TP.Code_Personne
INNER JOIN Table_Societe TS
ON TP.Code_Societe = TS.Code_Societe
GROUP BY TU.Prenom_Utilisateur + ' ' + TU.Nom_Utilisateur
ORDER BY TU.Prenom_Utilisateur

br

"bruno reiter [MVP]" <remove.this! wrote in message
news:
peut etre qqchose comme :

SELECT COUNT(case when TS.Niveau_Societe BETWEEN 1 AND 9
then TD.Code_Devis end) AS [Qté devis prospect],
COUNT(case when TS.Niveau_Societe BETWEEN 10 AND 30
then TD.Code_Devis) end AS [Qté devis Client],
TU.Prenom_Utilisateur + ' ' + TU.Nom_Utilisateur AS Commercial
FROM Table_Devis TD
INNER JOIN Table_Utilisateur TU
ON TD.Code_Utilisateur = TU.Code_Utilisateur
INNER JOIN Table_Personne TP
ON TD.Code_Personne = TP.Code_Personne
INNER JOIN Table_Societe TS
ON TP.Code_Societe = TS.Code_Societe
GROUP BY TU.Prenom_Utilisateur + ' ' + TU.Nom_Utilisateur
ORDER BY TU.Prenom_Utilisateur




br


"lefevre" wrote in message
news:4276b506$0$8209$
bonsoir

dans ma base j'ai

une table societe dans laquelle le niveau_societe indique prospect ou
client
une table utilisateurs (commerciaux)
chaque société est affecté à un commercial
une table devis
chaque devis est affecté à un commercial

SELECT case when Table_Societe.Niveau_Societe BETWEEN 1 AND 9 then
COUNT(Table_Devis.Code_Devis) end AS [Qté devis prospect],
case when Table_Societe.Niveau_Societe BETWEEN 10 AND
30 then COUNT(Table_Devis.Code_Devis) end AS [Qté devis Client],
Table_Utilisateur.Prenom_Utilisateur
+ ' ' + Table_Utilisateur.Nom_Utilisateur AS Commercial
FROM Table_Devis INNER JOIN
Table_Utilisateur ON Table_Devis.Code_Utilisateur =
Table_Utilisateur.Code_Utilisateur INNER JOIN
Table_Personne ON Table_Devis.Code_Personne =
Table_Personne.Code_Personne INNER JOIN
Table_Societe ON Table_Personne.Code_Societe =
Table_Societe.Code_Societe
GROUP BY Table_Utilisateur.Prenom_Utilisateur + ' ' +
Table_Utilisateur.Nom_Utilisateur, Table_Utilisateur.Prenom_Utilisateur
ORDER BY Table_Utilisateur.Prenom_Utilisateur

bien sur la reponse à ma requete est sans appel :
La colonne 'Table_Societe.Niveau_Societe' n'est pas valide dans la liste
de sélection parce qu'elle n'est pas contenue dans une fonction
d'agrégation ou dans la clause GROUP BY.

donc comment compter le total des devis prospects d'un coté et le total
des devis clients de l'autre regroupé par commercial en sachant que les
sociétés sont dans la meme table ?

je ne sais pas si je suis assez clair ?

merci.