Subquery returns more than 1 row
Résolu
julienbarr
-
julienbarr -
julienbarr -
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.
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
-
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-
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`
-
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?- À 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`
-