Subquery returns more than 1 row

Résolu/Fermé
julienbarr - Modifié le 24 juil. 2017 à 11:32
 julienbarr - 24 juil. 2017 à 16:38
Bonjour,

j'ai un soucis avec cette requête SQL :

SELECT(`total_ht`-
(SELECT (SUM(`buy_price_ht`*`qty`)) FROM `llx_facturedet` JOIN `llx_facture` ON `llx_facturedet`.fk_facture=`llx_facture`.`rowid` WHERE product_type!=0 AND `fk_facture`=`llx_facture`.`rowid` GROUP BY `fk_facture`)) FROM `llx_facturedet`
GROUP BY `fk_facture`

mais j'ai doit à une erreur "Subquery returns more than 1 row" .

En gros, je calcule une marge égale au total HT - prix de revient des produits.

Le "product_type!=0" me sert à ne pas prendre en compte le prix de revient des services.

Si ne mets pas le GROUP BY dans la sous requête pas d'erreur sauf qu'il soustrait le total de touts les prix de revient et pas uniquement de la facture concernée.

1 réponse

Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
24 juil. 2017 à 11:56
Bonjour,

Quand on utilise une sous-requête dans la clause SELECT, il faut qu'elle ne renvoie qu'une seule ligne.

Du coup je te propose plutôt de mettre ta sous requête en tant que table jointe, comme ceci :

SELECT fd.fk_facture, (fd.`total_ht`- s.somme)
FROM `llx_facturedet` fd
INNER JOIN (
    SELECT (SUM(`buy_price_ht`*`qty`)) as somme, fd.fk_facture
    FROM `llx_facturedet` fd
    JOIN `llx_facture` f ON fd.fk_facture = f.`rowid`
    WHERE product_type!=0 
    GROUP BY fd.`fk_facture`
) s ON s.fk_facture = fd.fk_facture
GROUP BY fd.`fk_facture` 


Xavier
0
Salut xavier,

Merci beaucoup pour ton aide, c'est ce qu'il me fallait !

Juste rajouté un SUM pour prendre en compte le fait qu'il y ait plusieurs produits sur la facture :

SELECT fd.fk_facture, (SUM(fd.`total_ht`)- s.somme) AS Marge 
FROM `llx_facturedet` fd 
INNER JOIN ( SELECT (SUM(`buy_price_ht`*`qty`)) as somme, fd.fk_facture FROM `llx_facturedet` fd JOIN `llx_facture` f ON fd.fk_facture = f.`rowid` WHERE product_type!=0 GROUP BY fd.`fk_facture` ) s ON s.fk_facture = fd.fk_facture 
GROUP BY fd.`fk_facture`
0
Finalement non, toujours bloqué quand je veux insérer ça dans ma requête complète :

SELECT `llx_facture`.`rowid`, `facnumber` AS refFacture, `ref_client` AS intituleFacture, GROUP_CONCAT(`description` SEPARATOR ' - ') AS description,`nom` AS societe,`llx_facture`.`datec` AS dateCreation, `datef` AS dateFacturation,`date_valid` AS dateValidation,`date_lim_reglement` AS dateLimReglement, ROUND(`llx_facture`.`total`) AS totalHT, SUM(`llx_facturedet`.`total_tva`) AS TVA, ROUND(`llx_facture`.`total_ttc`) AS totalTTC,ROUND(`llx_facturedet`.`buy_price_ht`) AS prixAchatHT, SUM((`total_ht`-(`buy_price_ht`*`qty`)))AS margeReelle, 
..............
FROM `llx_facture` JOIN `llx_societe` ON `llx_facture`.`fk_soc` =`llx_societe`.`rowid` JOIN `llx_facturedet` ON `llx_facture`.`rowid` = `llx_facturedet`.`fk_facture` GROUP BY `llx_facture`.`rowid`


J'aimerai mettre la deuxième marge juste après margeReelle.

Comment insérer ta requête dans cette requête?
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011 > julienbarr
Modifié le 24 juil. 2017 à 16:11
À tester, mais ceci devrait faire l'affaire :
SELECT `llx_facture`.`rowid`, `facnumber` AS refFacture,
    `ref_client` AS intituleFacture,
    GROUP_CONCAT(`description` SEPARATOR ' - ') AS description,
    `nom` AS societe,`llx_facture`.`datec` AS dateCreation,
    `datef` AS dateFacturation,`date_valid` AS dateValidation,
    `date_lim_reglement` AS dateLimReglement,
    ROUND(`llx_facture`.`total`) AS totalHT,
    SUM(`llx_facturedet`.`total_tva`) AS TVA,
    ROUND(`llx_facture`.`total_ttc`) AS totalTTC,
    ROUND(`llx_facturedet`.`buy_price_ht`) AS prixAchatHT,
    SUM((`total_ht`-(`buy_price_ht`*`qty`)))AS margeReelle, 
    (SUM(`llx_facturedet`.`total_ht`)- s.somme) AS Marge
FROM `llx_facture`
JOIN `llx_societe` ON `llx_facture`.`fk_soc` =`llx_societe`.`rowid`
JOIN `llx_facturedet` ON `llx_facture`.`rowid` = `llx_facturedet`.`fk_facture`
JOIN (
    SELECT (SUM(`buy_price_ht`*`qty`)) as somme, fd.fk_facture
    FROM `llx_facturedet` fd
    JOIN `llx_facture` f ON fd.fk_facture = f.`rowid`
    GROUP BY fd.`fk_facture`
) s ON s.fk_facture = `llx_facturedet`.`fk_facture`
GROUP BY `llx_facture`.`rowid`
0
julienbarr > Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021
24 juil. 2017 à 16:38
ça marche nikel, merci encore, bonne journée!
0