[SQL] Pour les kadors de la requête

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
patrice
Le #14653411
"Stéphane Miqueu" 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
Stéphane Miqueu
Le #14653381
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
Roumegou Eric
Le #14653371
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é)
Pierre BOUSQUET
Le #14653301
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. "
Jacques TREPP
Le #14653281
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)
Pierre BOUSQUET
Le #14653271
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. "
Stéphane Miqueu
Le #14653261
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
elecoest
Le #14653251
On 28 mar, 10:59, 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 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)
Stéphane Miqueu
Le #14653111
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
Firetox
Le #14653101
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"
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




Publicité
Poster une réponse
Anonyme