Ga naar inhoud

sql


Anoniem2

Aanbevolen berichten

Ik wil graag een overzicht maken van de bestellingen in een webshop (gebaseerd op zencart). Per bestelling wil ik afgezien van de algemene info het volgende in een tabel tonen per regel, totaal exclusief btw, totaal btw 21%, totaal btw 6%, totaal inclusief btw.\r\n\r\nHiervoor heb de onderstaande code geschreven. Hoewel ik nog niet weet of dit zo verder klopt loop ik eerst nog tegen een ander probleem aan:\r\nElke bestelling heeft een uniek id nummer echter kan een bestelling bestaan uit meerdere producten. Deze data (welke producten horen bij 1 bestelling) staat in de tabel \"orders_products\" (de 2e tabel dus). Elk besteld product heeft dus een nummer welke vervolgens weer aan de bestelling gekoppeld is aan de hand van het \"order_id\" nummer.\r\n\r\nHier onder heb ik dus de data uit 2 tabellen gekoppeld aan de hand van het order_id nummer. Echter komt het order_id nummer in de 2e tabel meerdere keren voor omdat een bestelling dus is opgebouwd uit meerdere producten.\r\n\r\nNu moet ik dus op één of andere manier eerst berekenen hoeveel btw 6% en hoeveel btw 21% er is betaald per bestelling wat vervolgens aan de hand van het order_id gekoppeld kan gaan worden aan de overige data uit de eerste tabel.\r\n\r\nHeeft iemand enig idee hoe ik dat kan doen?\r\n\r\n[PHP] $sql = \"\r\n SELECT\r\n 1.orders_id\r\n 1.customers_name,\r\n 1.customers_company,\r\n 1.date_purchased,\r\n 1.orders_status,\r\n 1.payment_method,\r\n 1.order_total,\r\n \r\n 2.orders_products_id\r\n 2.final_price,\r\n 2.products_quantity,\r\n 2.products_tax,\r\n \r\n FROM\r\n orders AS 1\r\n INNER JOIN\r\n orders_products AS 2\r\n ON 1.orders_id = 2.orders_id\r\n \r\n \". >= $startdatum && <=$einddatum\r\n ; [/PHP]
Link naar reactie
Dat is best een uitdaging. Is er ergens bekend wat het BTW-percentage van een product is? In neem aan van wel, of moet je dat ook nog gaan uitrekenen?\n\nHoe dan ook moet je je denk ik gaan verdiepen in subqueries en GROUP BY. In jouw code hoef je trouwens AS 1 en AS 2 niet te doen, je kunt ook de originele tabelnamen gebruiken.\n\nEven een hypothetisch voorbeeld, geen idee of het werkt want ik heb niets om het op te testen.\n\n[code]SELECT\n 1.orders_id\n 1.customers_name,\n 1.customers_company,\n 1.date_purchased,\n 1.orders_status,\n 1.payment_method,\n 1.order_total,\n `t6`.`tax`,\n `t21`.`tax`\nFROM `orders` AS 1\nLEFT JOIN\n (SELECT `orders_id`, SUM(`products_tax`) AS `tax` \n FROM `orders_products`\n GROUP BY `products_tax`\n WHERE `tax_percent` = 6)\n AS `t6`\n ON `1`.`orders_id` = `t6`.`orders_id`\nLEFT JOIN\n (SELECT `orders_id`, SUM(`products_tax`) AS `tax`\n FROM `orders_products`\n GROUP BY `products_tax`\n WHERE `tax_percent` = 21)\n AS `t21`\n ON `1`.`orders_id` = `t21`.`orders_id`[/code]\n\nHet kan zijn dat AS `t6` en AS `t21` op de verkeerde plek staan. Daar zit ik zelf altijd mee te stoeien.
Link naar reactie
In de 2e tabel staat deze relevante data:\n\norders_products.orders_id: [U]Bestel nummer, komt overeen met die uit de andere tabel[/U]\norders_products.orders_products_id : [U]Uniek nummer (voor dit product voor 1 keer)[/U]\norders_products.final_price: [U]De prijs excl btw die de klant heeft betaald[/U]\norders_products.products_quantity: [U]Aantal keer dat het product besteld is[/U]\norders_products.products_tax: [U]Het btw tarief wat voor dit product geld/gold[/U]\n\nIk moet het dus zo krijgen dat hij eerst in deze tabel kijkt naar bijvoorbeeld order_id 1 \n1) Hij kijkt dan of een zelfde product meerdere keren is bestel en vermenigvuldigd dit dan met het aantal.\n2) Hij telt alle bedragen van dat btw tarief bij elkaar op.\n3) Hij berekent het btw bedrag uit (products.final_price*0.21) .\n4) Hij doet hetzelfde met de andere btw tarieven.\n5) hij kopeld deze info aan de info uit de andere tabel.\n\nDaarna door naar orders_id 2 enz. \n\nik weet dus het betaalde btw bedrag niet maar wel het tarief en het bedrag exclusief (per product). \n\nin de bijlage heb ik een printscreen van php my admin tabel 2\n\n(overigens word btw 19% en 21% als hetzelfde beschouwd namelijk btw hoog)
Link naar reactie
Ik heb er inmiddels dit onderstaande van gemaakt.\r\n\r\nIk snap op zich wel wat er moet gebeuren alleen het deel met : \r\n\r\n`tlaag`.`tax`,\r\n`thoog`.`tax` \r\n\'tnul`.`tax` \r\n\r\nWat gebeurt hier mee nou pressies ?\r\n\r\nen hier AS `tax` en hier AS `tlaag`?\r\n\r\noverigens moet ik ook nog de resultaten filteren op datum en op status (alleen afgeronde bestellingen zijn relevant). \r\n\r\n[PHP] $start = $startdatum[\'startdatum\'];\r\n $eind = $einddatum[\'einddatum\'];\r\n \r\n $nul = 0;\r\n $laag = 6;\r\n $laagnieuw = ;\r\n $hoogoud = 19;\r\n $Hoog = 21;\r\n $Hoognieuw = ;\r\n \r\n $sql = \"\r\n SELECT\r\n orders.orders_id,\r\n orders.customers_name,\r\n orders.customers_company,\r\n orders.date_purchased,\r\n orders.orders_status,\r\n orders.payment_method, \r\n orders.order_total,\r\n \r\n `tlaag`.`tax`,\r\n `thoog`.`tax` \r\n `tnul`.`tax` \r\nFROM\r\n orders \r\n\r\nLEFT JOIN\r\n (SELECT `orders_id`, SUM(`final_price`* `products_quantity`) AS `tax` \r\n FROM `orders_products`\r\n WHERE `products_tax` = $laag || $laagnieuw)\r\n AS `tlaag`\r\n ON orders.orders_id = `tlaag`.`orders_id`\r\n\r\nLEFT JOIN\r\n (SELECT `orders_id`, SUM(`final_price`* `products_quantity`) AS `tax`\r\n FROM `orders_products`\r\n WHERE `products_tax` = $hoog || $hoognieuw || $Hoognieuw)\r\n AS `thoog`\r\n ON orders.orders_id = `thoog`.`orders_id`\r\n \r\nLEFT JOIN\r\n (SELECT `orders_id`, SUM(`final_price` * `products_quantity`) AS `tax`\r\n FROM `orders_products`\r\n WHERE `products_tax` = $nul )\r\n AS `tnul`\r\n ON orders.orders_id = `tnul`.`orders_id`\r\n \r\n \" ; \r\n \r\nif(!$res = mysql_query($sql))\r\n{\r\n trigger_error(mysql_error().\'
In query: \'.$sql);\r\n}\r\nelseif(mysql_num_rows($res) == 0)\r\n{\r\n echo \'Geen data gevonden.\';\r\n}\r\nelse\r\n{ echo \'\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \';\r\n\r\n\r\n while($row = mysql_fetch_assoc($res))\r\n \r\n {\r\n echo \r\n \'\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \';\r\n \r\n }\r\n\r\necho \'
DatumFactuur nr.factuur nr.
corectie
OmschrijvingKlantPrijs exclBTW HoogBTW laagBTW NulTotaalStatus
\'$row[\'date_purchased\'].\'\'$row[\'orders_id\'].\' \'$row[\'payment_method\'].\'\'$row[\'customers_name\'].\'
\'$row[\'customers_company\'].\'
\'$row[\'order_total\'].\'\'$row[\'thoog\'].\'\'$row[\'tlaag\'].\'\'$row[\'tnul\'].\'\'$row[\'order_total\'] + $row[\'tlaag\'] + $row[\'thoog\'].\'\'$row[\'orders_status\'].\'
\'\r\n \r\n \r\nmysql_close();\r\n\r\n?>[/PHP]
Link naar reactie
Moet het trouwens één query worden? Bij dit soort complexe dingen is het vaak handiger om meer queries te doen. Dat is minder efficient, maar een stuk makkelijker te begrijpen.\nDan doe je eerst een query die alle bestellingen opvraagt, gefilterd op datum en status. In de loop van die query ga je dan voor iedere bestelling een nieuwe query doen waar je de product details opvraagt. Eventueel laat je dan wat extra berekeningen door PHP doen.\n\n[php]$sql = \"SELECT * FROM `orders` WHERE `date_purchased` BETWEEN \'\"$datum_start\"\' AND \'\".$datum_eind.\"\' AND `orders_status` = \'open\'\";\n$result = mysqli_query($link, $sql);\nwhile ($row = mysqli_fetch_assoc($result)) {\n\n$sql2 = \"SELECT SUM(`producs_price`), `products_tax` FROM `orders_products` WHERE `orders_id` = \'\".$row[\'orders_id\'].\"\' GROUP BY `products_tax`\";\n$result2 = mysqli_query($link, $sql2);\n//etc\n\n}[/php]\n\nEDIT:\nDit werkt toch niet, of wel:\n[code]WHERE `products_tax` = $hoog || $hoognieuw || $Hoognieuw[/code]\n\nMoet volgens mij iets zijn als \n[code]WHERE `products_tax` IN ($hoog,$hoognieuw,$Hoognieuw)[/code]
Link naar reactie
Ok dit is wat ik nu helemaal heb, niet veel verder gekomen moet ik toe geven.\r\n\r\nvlak onder de sql query staat nu //etc maar is het niet zo dat aangezien het per belasting groep word gegroepeerd dat ik verder geen code hier voor nodig heb?\r\n\r\nOverigens doet nog niks het, geen foutcode, niks. De datum wil ik dus kunnen intypen in het formulier waarna het die waardes gebruikt om te selecteren maar zelfs het formulier word niet getoond. Het zal vast vol fouten zitten maar ik zie ze niet.\r\n\r\nKan iemand me zeggen hoe ik het het beste te werk ga (een stappenplan o.i.d)?\r\n\r\n[CODE]\r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\r\nIn query: \'.$sql);\r\n}\r\nelseif(mysql_num_rows($res) == 0)\r\n{\r\n echo \'Geen data gevonden.\';\r\n}\r\nelse\r\n{ echo \'\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \';\r\n\r\n\r\n while($row = mysql_fetch_assoc($res))\r\n \r\n {\r\n echo \r\n \'\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \';\r\n \r\n }\r\n\r\necho \'
DatumFactuur nr.factuur nr.
corectie
OmschrijvingKlantPrijs exclBTW HoogBTW laagBTW NulTotaalStatus
\'$row[\'date_purchased\'].\'\'$row[\'orders_id\'].\' \'$row[\'payment_method\'].\'\'$row[\'customers_name\'].\'
\'$row[\'customers_company\'].\'
\'$row[\'order_total\'].\'\'$row[\'thoog\'].\'\'$row[\'tlaag\'].\'\'$row[\'tnul\'].\'\'$row[\'order_total\'] + $row[\'tlaag\'] + $row[\'thoog\'].\'\'$row[\'orders_status\'].\'
\'\r\n \r\n \r\nmysql_close();\r\n\r\n?>\r\n\r\n[/CODE]
Link naar reactie
Bij //etc heb je geen sql code nodig. Je moet natuurlijk wel iets met het resultaat doen. Nu lijkt het alsof je twee dingen onder elkaar hebt geplakt.\n\nDat het niks doet klopt. Er is namelijk geen enkele connectie tussen het formulier en de rest van het script. Maar daarvoor moeten ook nog eerst de syntax fouten uit de php code gehaald worden. Er ontbreekt in ieder geval een puntkomma voor mysql_close.\n\nAls je geen foutmelding krijgt zou het kunnen dat die zijn uitgeschakeld. Zeker als je dit probeert op je productieserver is dat heel goed mogelijk. Vaak wordt dat gedaan om het kwaadwillenden moeilijker te maken zwakke plekken in je script te vinden.
Link naar reactie
Ok inmiddels heb ik een html formulier gemaakt en deze gekoppeld aan het sql script (zie de scripts hier onder).\r\nHet html formulier spreekt voor zich. Vervolgens roept het php script dus verschillende informatie op wat later getoond moet worden natuurlijk. Maar klopt dat script sql/php technisch zo want er gebeurt nog niets (ook geen fout codes. Voor zover ik het nu zie klopt dit toch? \r\n\r\nWel moet er nog bij $sql2 = \"SELECT SUM(`producs_price`), gezorgd worden dat dit producs_price keer (x) products_quantity word (hetzelfde product kan meerdere keren besteld zijn ) maar kan ik daar gewoon een * voor gebruiken?\r\n\r\n[HTML]
\r\n

\r\n \r\n \r\n

\r\n

\r\n \r\n \r\n

\r\n

\r\n \r\n

\r\n
[/HTML]\r\n\r\n[PHP]
Link naar reactie
Waarom werk je met GET in je formulier ipv POST?\nWaarom maak je nieuwe variabelen aan ($datum_start en $datum_eind)?\nWaar controleer je of beide waarden wel een datum zijn?\nWat zit er in de beide variabelen?\nKlopt de query met wat je verwacht?\nWaar is de foutafhandeling van je query?\nIk zie nergens dat je error-reporting hebt aangezet.
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...