ALLODREN
Messages postés8Date d'inscriptionvendredi 17 avril 2009StatutMembreDernière intervention30 juin 2009
-
27 mai 2009 à 15:09
ALLODREN
Messages postés8Date d'inscriptionvendredi 17 avril 2009StatutMembreDernière intervention30 juin 2009
-
27 mai 2009 à 15:13
Bonjour,
Concernant le SUM et le GROUP BY :
__On groupe toujours par au moins tous les éléments de la sélection___
Mais dans ce cas : cela ne me calcule pas correctement mon besoin qui est :
Addition des valeurs "px_commande" pour toutes les lignes de ma table qui ont : nucdli = nu_document.
On affiche la somme dans le px_commande de la ligne où se trouve le "nu_document" identique.
Et on ne retient plus la ligne où se trouve le "nucdli" lié.
Mon premier résultat est l'addition entre la première et seconde ligne qui ont nucdli = nu_document.
---> RÉCAPITULONS:
Dans un premier temps, cette requête regroupe les "nucdli"
(n° commandes liées) et les "nu_document" ( n ° commande ) qui ont les mêmes identifiants ( 2 colonnes dans une même table qui ont les mêmes identifiants).
Dans un second temps, elle est censée additionner les "px_commande" ( le coût des commandes) des regroupements ( au total, il y a 8 regroupement sur 40 664 lignes ).
Étant donnée que ma requête fusionne les "nucdli" et les "nu_document" qui ont les mêmes identifiants, et qu'il y en a 8, la requête devrait me retourner 40 656 lignes.
Or ma requête fait bien la somme et effectue bien la fusion mais ne me renvoi que 40 546 lignes soit une centaine en moins !
Voici ma requête :
SELECT
A.id_produit,
A.id_fournisseur,
A.ty_document,
A.nu_document,
A.qt_cmde_ini ,
A.px_commande,
A.ty_commande,
(A.px_commande*A.qt_cmde_ini) AS Valorisation,
A.id_user
/* Calcul de la somme*/
FROM(
SELECT
k.id_produit,
k.id_fournisseur,
k.dt_document,
k.qt_cmde_ini,
k.ty_commande,
k.id_societe,
k.id_offre,
k.ty_document,
k.nu_document,
k.nucdli,
k.id_user,
k.dt_livraison,
k.dt_confirmation,
sum(k.px_commande) AS px_commande /* Calcul de la somme*/
FROM(
SELECT /* SOUS REQUETE 2. Extraction des données agrégées par CDA*/
z.id_produit,
z.id_fournisseur,
z.dt_document,
z.qt_cmde_ini,
z.ty_commande,
z.id_societe,
z.id_offre,
z.id_user,
z.dt_livraison,
z.dt_confirmation,
z.px_commande,
CASE z.cde_ter /*Dans le cas de cde ter*/
WHEN 0 THEN z.ty_document /* Si cde ter = 0 ( quand ty_document <> CDA alors on récupère ty_document*/
ELSE 'CDA' /* Sinon on récupère CDA*/
END AS ty_document, /*Tout ceci est dans ty_document*/
CASE z.cde_ter
WHEN 1 THEN NULL /* Si ty_document = CDA * alors on récupère rien */
ELSE z.nucdli /*Sinon on récupère z.nucdli*/
END AS nucdli, /*tout ceci est dans nucdli, z.px_commande, z.cde_ter*/
z.cde_ter,
CASE z.cde_ter
WHEN 1 THEN z.nucdli /* Si ty_document = CDA alors on écrit rien z.nucdli */
ELSE z.nu_document /* Sinon on récupère nu_document */
END AS nu_document /* Tout ceci est dans nu_document */
FROM (SELECT *,
/* SOUS REQUETE 3. Agrégation des données dans le cas où nucdli = nu_commande */
CASE
WHEN EXISTS (SELECT 1 /* SOUS REQUETE 4. Extraction des données où nucdli nu_commande et ty_commande CDA */
FROM tbl_ligneachat h
WHERE h.id_produit = q.id_produit
AND q.nucdli = h.nu_document
AND h.ty_document = 'CDA') /* FIN SOUS REQUETE 4 */
THEN 1
ELSE 0
END AS cde_ter
FROM tbl_ligneachat Q
)AS z /* FIN SOUS REQUETE 3 */
)AS k
GROUP BY
k.id_produit,
k.qt_cmde_ini,
k.ty_commande,
k.nu_document,
k.nucdli,
k.id_societe,
k.id_offre
)AS A
ALLODREN
Messages postés8Date d'inscriptionvendredi 17 avril 2009StatutMembreDernière intervention30 juin 2009 27 mai 2009 à 15:13
Plus clairement :
Concernant le SUM et le GROUP BY :
__On groupe toujours par au moins tous les éléments de la sélection___
Mais dans ce cas : cela ne me calcule pas correctement mon besoin qui est :
Addition des valeurs "px_commande" pour toutes les lignes de ma table qui ont : nucdli = nu_document.
On affiche la somme dans le px_commande de la ligne où se trouve le "nu_document" identique.
Et on ne retient plus la ligne où se trouve le "nucdli" lié.
Mon premier résultat est l'addition entre la première et seconde ligne qui ont nucdli = nu_document.
---> RÉCAPITULONS:
Dans un premier temps, cette requête regroupe les "nucdli"
(n° commandes liées) et les "nu_document" ( n ° commande ) qui ont les mêmes identifiants ( 2 colonnes dans une même table qui ont les mêmes identifiants).
Dans un second temps, elle est censée additionner les "px_commande" ( le coût des commandes) des regroupements ( au total, il y a 8 regroupement sur 40 664 lignes ).
Étant donnée que ma requête fusionne les "nucdli" et les "nu_document" qui ont les mêmes identifiants, et qu'il y en a 8, la requête devrait me retourner 40 656 lignes.
Or ma requête fait bien la somme et effectue bien la fusion mais ne me renvoi que 40 546 lignes soit une centaine en moins !
Voici ma requête :
SELECT
A.id_produit,
A.id_fournisseur,
A.ty_document,
A.nu_document,
A.qt_cmde_ini ,
A.px_commande,
A.ty_commande,
(A.px_commande*A.qt_cmde_ini) AS Valorisation,
A.id_user
/* Calcul de la somme*/
FROM(
SELECT
k.id_produit,
k.id_fournisseur,
k.dt_document,
k.qt_cmde_ini,
k.ty_commande,
k.id_societe,
k.id_offre,
k.ty_document,
k.nu_document,
k.nucdli,
k.id_user,
k.dt_livraison,
k.dt_confirmation,
sum(k.px_commande) AS px_commande /* Calcul de la somme*/
FROM(
SELECT /* SOUS REQUETE 2. Extraction des données agrégées par CDA*/
z.id_produit,
z.id_fournisseur,
z.dt_document,
z.qt_cmde_ini,
z.ty_commande,
z.id_societe,
z.id_offre,
z.id_user,
z.dt_livraison,
z.dt_confirmation,
z.px_commande,
CASE z.cde_ter /*Dans le cas de cde ter*/
WHEN 0 THEN z.ty_document /* Si cde ter = 0 ( quand ty_document <> CDA alors on récupère ty_document*/
ELSE 'CDA' /* Sinon on récupère CDA*/
END AS ty_document, /*Tout ceci est dans ty_document*/
CASE z.cde_ter
WHEN 1 THEN NULL /* Si ty_document = CDA * alors on récupère rien */
ELSE z.nucdli /*Sinon on récupère z.nucdli*/
END AS nucdli, /*tout ceci est dans nucdli, z.px_commande, z.cde_ter*/
z.cde_ter,
CASE z.cde_ter
WHEN 1 THEN z.nucdli /* Si ty_document = CDA alors on écrit rien z.nucdli */
ELSE z.nu_document /* Sinon on récupère nu_document */
END AS nu_document /* Tout ceci est dans nu_document */
FROM (SELECT *,
/* SOUS REQUETE 3. Agrégation des données dans le cas où nucdli = nu_commande */
CASE
WHEN EXISTS (SELECT 1 /* SOUS REQUETE 4. Extraction des données où nucdli nu_commande et ty_commande CDA */
FROM tbl_ligneachat h
WHERE h.id_produit = q.id_produit
AND q.nucdli = h.nu_document
AND h.ty_document = 'CDA') /* FIN SOUS REQUETE 4 */
THEN 1
ELSE 0
END AS cde_ter
FROM tbl_ligneachat Q
)AS z /* FIN SOUS REQUETE 3 */
)AS k
GROUP BY
k.id_produit,
k.qt_cmde_ini,
k.ty_commande,
k.nu_document,
k.nucdli,
k.id_societe,
k.id_offre
)AS A