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

[SQL] Pour les kadors de la requête

12 réponses
Avatar
Stéphane Miqueu
Bonjour,
Je bloque sur une requête alors si vous avez 2mn à m'accorder ...

Soit une table contenant toutes les lignes de factures depuis 1999.
Je voudrais sortir un résultat sous la forme :
Client / CA (N-1) / CA (N)

Pour l'instant j'ai fait 2 vues que je mixe mais je voudrais faire ça
en une seule requête. Est-ce possible ? Je l'ai tourné dans tous les
sens mais pour l'instant je sèche. Même SQLzoo ne m'a pas aidé, ou
alors j'ai pas bien cherché.

--
Ami Calmant
Stéphane

10 réponses

1 2
Avatar
patrice
"Stéphane Miqueu" a écrit dans le message de
news:
Bonjour,
Je bloque sur une requête alors si vous avez 2mn à m'accorder ...

Soit une table contenant toutes les lignes de factures depuis 1999.
Je voudrais sortir un résultat sous la forme :
Client / CA (N-1) / CA (N)




la jointure de 2 req est la solution sql
apres pour aller plus loin y'a 2 solution:
-par programmation, faire un select qui renvoi client,N,CA et "redresser" le
résultat
lig = findlig(result.client)
col=findcol(result.N)
tab[lig][col]=result.CA
-voir les instruction sql de la sgbd cible
par exemple,avec oracle y'a decode
ta requete pourrait s'écrire
select client,sum( decode(N,2006,CA,0)),sum(decode(N,2007,CA,0)) from table
group by client
Avatar
Stéphane Miqueu
Il se trouve que patrice a formulé :
la jointure de 2 req est la solution sql
apres pour aller plus loin y'a 2 solution:
-par programmation, faire un select qui renvoi client,N,CA et "redresser" le
résultat
lig = findlig(result.client)
col=findcol(result.N)
tab[lig][col]=result.CA
-voir les instruction sql de la sgbd cible
par exemple,avec oracle y'a decode
ta requete pourrait s'écrire
select client,sum( decode(N,2006,CA,0)),sum(decode(N,2007,CA,0)) from table
group by client



Merci pour ta réponse. Mon SGBD est SQLServeur où le DECODE est
inconnu. Je vais me rabattre vers la jointure de 2 requêtes à moins
qu'un Kador en SQLServeur me sauve ...

--
Ami Calmant
Stéphane
Avatar
Roumegou Eric
Stéphane Miqueu avait énoncé :
Il se trouve que patrice a formulé :
la jointure de 2 req est la solution sql
apres pour aller plus loin y'a 2 solution:
-par programmation, faire un select qui renvoi client,N,CA et "redresser"
le
résultat
lig = findlig(result.client)
col=findcol(result.N)
tab[lig][col]=result.CA
-voir les instruction sql de la sgbd cible
par exemple,avec oracle y'a decode
ta requete pourrait s'écrire
select client,sum( decode(N,2006,CA,0)),sum(decode(N,2007,CA,0)) from table
group by client



Merci pour ta réponse. Mon SGBD est SQLServeur où le DECODE est inconnu. Je
vais me rabattre vers la jointure de 2 requêtes à moins qu'un Kador en
SQLServeur me sauve ...



en voila un qui ne connait pas http://sqlzoo.net/

pour les équivalences entre sql, c'est super.
ton cas peut se gérer avec un case.

--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Pierre BOUSQUET
j'ai fait cette requete vite fait sur mes fichiers, si ca peut t'aider

select f1.annee, f1.ca, f2.annee, f2.ca
from (select Year(do_date) as annee, SUM(dl_montantht)as ca from
f_docligne group by year(do_date)) f1
left join (select Year(do_date) as annee, SUM(dl_montantht)as ca from
f_docligne group by year(do_date)) f2 on f2.anneeñ.annee-1

Il se trouve que Stéphane Miqueu a formulé :
Bonjour,
Je bloque sur une requête alors si vous avez 2mn à m'accorder ...

Soit une table contenant toutes les lignes de factures depuis 1999.
Je voudrais sortir un résultat sous la forme :
Client / CA (N-1) / CA (N)

Pour l'instant j'ai fait 2 vues que je mixe mais je voudrais faire ça en une
seule requête. Est-ce possible ? Je l'ai tourné dans tous les sens mais pour
l'instant je sèche. Même SQLzoo ne m'a pas aidé, ou alors j'ai pas bien
cherché.



--
Pierre BOUSQUET

" Ne me dites pas que ce problème est difficile.
S'il n'était pas difficile, ce ne serait pas un problème. "
Avatar
Jacques TREPP
Salut Stéphane
j'ai une stat qui compare Jour N et jour N-1. j'utilise une table temporaire
que je remplis avec une requète:
mais le traitement part d'une table mémoire contenant les jours de la
semaine et des dates N et N-1. Le but étant de récupérer les CA N et N-1.

// --------------------------------- création de la table temporaire
g_cReq = "CREATE TABLE stat_compare ("...
+"joursemaine varchar(10) default NULL, "...
+"dateref date default NULL,"...
+"caref decimal(10,2) NULL default '0.00', "...
+"datecomp date default NULL, "...
+"cacomp decimal(10,2) NULL default '0.00'"...
+") ENGINE=InnoDB DEFAULT CHARSET=latin1"

SI PAS Execute_Requete() ALORS RETOUR

// --------------------------------- remplissage de la table
i est un entier
POUR i = 1 A TableOccurrence(Table1)
g_cReq = "insert into stat_compare set dateref = "+Quote(date1[i])+", "...
+"caref = (select round(sum(qte*pxvttc),2) from det_ticket "...
+"inner join ticket on det_ticket.id_ticket = ticket.id_ticket "...
+"where datfct = "+Quote(date1[i])+" and type_lg in ('ART','ANL','REM')
"...
+"group by datfct), "...
+"datecomp = "+Quote(date2[i])+", "...
+"cacomp = (select round(sum(qte*pxvttc),2) from det_ticket "...
+"inner join ticket on det_ticket.id_ticket = ticket.id_ticket "...
+"where datfct = "+Quote(date2[i])+" and type_lg in ('ART','ANL','REM')
"...
+"group by datfct)"
Execute_Requete(g_cReq,Faux)
FIN

ça devrait pouvoir s'adapter.

A+

--
Jacques TREPP
Albygest
3, rue Jean Mermoz
81160 ST-JUERY
(enlevez 'pasdespam' pour me joindre)
Avatar
Pierre BOUSQUET
quoi ! elle est pas bonne ma solution ?

lol


Jacques TREPP a émis l'idée suivante :

Salut Stéphane
j'ai une stat qui compare Jour N et jour N-1. j'utilise une table temporaire
que je remplis avec une requète:
mais le traitement part d'une table mémoire contenant les jours de la semaine
et des dates N et N-1. Le but étant de récupérer les CA N et N-1.

// --------------------------------- création de la table temporaire
g_cReq = "CREATE TABLE stat_compare ("...
+"joursemaine varchar(10) default NULL, "...
+"dateref date default NULL,"...
+"caref decimal(10,2) NULL default '0.00', "...
+"datecomp date default NULL, "...
+"cacomp decimal(10,2) NULL default '0.00'"...
+") ENGINE=InnoDB DEFAULT CHARSET=latin1"

SI PAS Execute_Requete() ALORS RETOUR

// --------------------------------- remplissage de la table
i est un entier
POUR i = 1 A TableOccurrence(Table1)
g_cReq = "insert into stat_compare set dateref = "+Quote(date1[i])+", "...
+"caref = (select round(sum(qte*pxvttc),2) from det_ticket "...
+"inner join ticket on det_ticket.id_ticket = ticket.id_ticket "...
+"where datfct = "+Quote(date1[i])+" and type_lg in ('ART','ANL','REM')
"...
+"group by datfct), "...
+"datecomp = "+Quote(date2[i])+", "...
+"cacomp = (select round(sum(qte*pxvttc),2) from det_ticket "...
+"inner join ticket on det_ticket.id_ticket = ticket.id_ticket "...
+"where datfct = "+Quote(date2[i])+" and type_lg in ('ART','ANL','REM') "...
+"group by datfct)"
Execute_Requete(g_cReq,Faux)
FIN

ça devrait pouvoir s'adapter.

A+



--
Pierre BOUSQUET

" Ne me dites pas que ce problème est difficile.
S'il n'était pas difficile, ce ne serait pas un problème. "
Avatar
Stéphane Miqueu
Stéphane Miqueu a présenté l'énoncé suivant :
Bonjour,
Je bloque sur une requête alors si vous avez 2mn à m'accorder ...

Soit une table contenant toutes les lignes de factures depuis 1999.
Je voudrais sortir un résultat sous la forme :
Client / CA (N-1) / CA (N)

Pour l'instant j'ai fait 2 vues que je mixe mais je voudrais faire ça en une
seule requête. Est-ce possible ? Je l'ai tourné dans tous les sens mais pour
l'instant je sèche. Même SQLzoo ne m'a pas aidé, ou alors j'ai pas bien
cherché.



Merci à tous, je regarde tout ça de près.

--
Ami Calmant
Stéphane
Avatar
elecoest
On 28 mar, 10:59, Stéphane Miqueu wrote:
Stéphane Miqueu a présenté l'énoncé suivant :

> Bonjour,
> Je bloque sur une requête alors si vous avez 2mn à m'accorder ...

> Soit une table contenant toutes les lignes de factures depuis 1999.
> Je voudrais sortir un résultat sous la forme :
> Client / CA (N-1) / CA (N)

> Pour l'instant j'ai fait 2 vues que je mixe mais je voudrais faire ça en une
> seule requête. Est-ce possible ? Je l'ai tourné dans tous les sens mais pour
> l'instant je sèche. Même SQLzoo ne m'a pas aidé, ou alors j'ai pa s bien
> cherché.



select nvl(l1.client, l2.client), sum(nvl(l1.ca, 0)), sum(nvl(l2.ca,
0))
ligfac l1 outer join ligfac l2 on l1.client = l2.client and
year(l1.date) = year(l2.date) - 1
group by nvl(l1.client, l2.client)

=> un client peut avoir du CA l'année n et pas l'année n+1 (client
perdu)
un client peut avoir du CA l'année n+1 et pas l'année n (client
gagné)

D'où le outer join (ni left ni right on fait du pur produit cartésien)
idem pour le subtilité nvl(l1.client, l2.client)
Avatar
Stéphane Miqueu
avait écrit le 28/03/2007 :
select nvl(l1.client, l2.client), sum(nvl(l1.ca, 0)), sum(nvl(l2.ca,
0))
ligfac l1 outer join ligfac l2 on l1.client = l2.client and
year(l1.date) = year(l2.date) - 1
group by nvl(l1.client, l2.client)

=> un client peut avoir du CA l'année n et pas l'année n+1 (client
perdu)
un client peut avoir du CA l'année n+1 et pas l'année n (client
gagné)

D'où le outer join (ni left ni right on fait du pur produit cartésien)
idem pour le subtilité nvl(l1.client, l2.client)



Bonjour et merci pour ton aide.

Je regarde ta solution et j'essai de l'adapter. Par contre je ne
connais pas la commande nvl ... TransacSQL ne connait pas non plus.
Quel est l'usage de cette commande ?

--
Ami Calmant
Stéphane
Avatar
Firetox
Bonjour stephane

nvl est la fonction ifnull en mySQLou postGreSQL mais pour oracle c'est NVL
sous SQLServeur c'est :isnull ou ifnull

IFNULL(val1,val2)
la fonction renvoie la val2 si val1 est null sinon val1

Bon dev
@+

Firetox

"Stéphane Miqueu" a écrit dans le message de news:

avait écrit le 28/03/2007 :
select nvl(l1.client, l2.client), sum(nvl(l1.ca, 0)), sum(nvl(l2.ca,
0))
ligfac l1 outer join ligfac l2 on l1.client = l2.client and
year(l1.date) = year(l2.date) - 1
group by nvl(l1.client, l2.client)

=> un client peut avoir du CA l'année n et pas l'année n+1 (client
perdu)
un client peut avoir du CA l'année n+1 et pas l'année n (client
gagné)

D'où le outer join (ni left ni right on fait du pur produit cartésien)
idem pour le subtilité nvl(l1.client, l2.client)



Bonjour et merci pour ton aide.

Je regarde ta solution et j'essai de l'adapter. Par contre je ne connais
pas la commande nvl ... TransacSQL ne connait pas non plus. Quel est
l'usage de cette commande ?

--
Ami Calmant
Stéphane




1 2