Ja als het kan wel want dat scheelt me wat logica in de stap ernaquote:Op donderdag 21 juli 2011 11:41 schreef Pakspul het volgende:
Oh je wilt ook met 0 erbij dat had ik niet gezien, even overheen gelezen ;+
Geef me paar minuten en je hebt je query
1 2 3 4 5 6 7 8 9 10 | SELECT ID, Names, (SELECT COUNT(t2.ID) FROM `names` t2 WHERE t2.Names = t1.Names AND Status = 'Passed' ) as 'Passed', (SELECT COUNT(t2.ID) FROM `names` t2 WHERE t2.Names = t1.Names AND Status = 'Failed' ) as 'Failed', (SELECT COUNT(t2.ID) FROM `names` t2 WHERE t2.Names = t1.Names AND Status = 'Skipped' ) as 'Skipped' FROM `names` t1 GROUP BY t1.Names |
Heb al getest met 1 naam en hij doet hetquote:Op donderdag 21 juli 2011 12:15 schreef Pakspul het volgende:
Haal Skipped en failed er eens uit en voer hem nog eens uit en kijk eens of hij het wel doet?
1 | SELECT Names, Status, COUNT(ID) AS 'Count' FROM tabel GROUP BY Names, Status |
1 2 3 4 5 6 7 8 9 10 11 | <?php $array = array( 'naam_1' => array( 'Passed = 0, 'Skipped = 0, 'Failed' = 0, ), ); $array[$record['Names']]['Passed'] = $record['Count']; ?> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php $result = mysql_query('SELECT Names, Status, COUNT(ID) AS 'Count' FROM tabel GROUP BY Names, Status'); $outputArray = array(); while($record = mysql_fetch_assoc($result) { if ( isset($outputArray[$record['Names']]) === false ) { $outputArray[$record['Names']] = array( 'Passed' = 0, 'Skipped' = 0, 'Failed' = 0, ); } $outputArray[$record['Names']][$record['Status']] = $record['Count']; } ?> |
1 2 3 4 5 6 7 | <?php foreach ($outputArray as $naam => $info) { // voorbeeld output: 'Naam_1 (5,2,0) echo $naam . " (" . $info['Passed'] . "," . $info['Skipped'] . "," . $info['Failed'] . ")"; } ?> |
Zoiets?quote:Op maandag 25 juli 2011 12:50 schreef Cue_ het volgende:
Kort vraagje;
Ik wil een rij van de ene tabel naar de andere tabel queryen.
wat eigenlijk neer komt op :
insert into table1 values (select * from table 2 where iets = iets)
Maar letterlijk werkt ie zo niet, want hij ziet volgens mij die select als 1 value.Iemand ideeen?
tnx alvast!
1 2 3 | INSERT INTO target_table (col1, col2, col3, col4) SELECT (col1, col2, col3, col4) FROM source_table WHERE iets = iets; |
Ja, maar dat is toch sowieso wel een goed idee? Anders faalt je query als je later ooit eens een kolom aan je tabel toevoegt.quote:Op maandag 25 juli 2011 12:58 schreef Cue_ het volgende:
[..]
Ik zal dus echt alle kolomnamen moeten uitschrijven?
de twee tabellen zullen identiek zijn, dus daar maak ik me geen zorgen over. Maar tnxquote:Op maandag 25 juli 2011 13:24 schreef Tijn het volgende:
Ja, maar dat is toch sowieso wel een goed idee? Anders faalt je query als je later ooit eens een kolom aan je tabel toevoegt.
Famous last wordsquote:
Ik ben wel benieuwd waarom je eigenlijk dubbele data wil opslaan in je database. Heb je niet genoeg aan gewoon het ID van de rij die je nodig hebt?quote:Maar tnxhij werkt!
Ik vermoed dat het iets van logging of archiving is dat Cue_ wil bewerkstelligen.quote:Op maandag 25 juli 2011 13:41 schreef Tijn het volgende:
[..]
Famous last words
[..]
Ik ben wel benieuwd waarom je eigenlijk dubbele data wil opslaan in je database. Heb je niet genoeg aan gewoon het ID van de rij die je nodig hebt?
Dat inderdaadquote:Op maandag 25 juli 2011 13:41 schreef Scorpie het volgende:
Ik vermoed dat het iets van logging of archiving is dat Cue_ wil bewerkstelligen.
1 2 3 4 5 6 | <?php $results[2010]['medewerker']['jan']['percentage'] = 10 $results[2010]['medewerker']['piet']['percentage'] = 20 $results[2011]['medewerker']['jan']['percentage'] = 15 $results[2011]['medewerker']['piet']['percentage'] = 20 ?> |
Data replicatie is niet altijd de beste manier. Kan je neit beter gewoon een indicator maken die aangeeft dat de record in kwestie is verwijderd/readonly/archived is ?quote:Op maandag 25 juli 2011 13:43 schreef Cue_ het volgende:
[..]
Dat inderdaad![]()
Zijn waarschijnlijk nog wel meer methodes voor, maar deze is voor dit geval gekozen.
Het probleem is dat hij alle jaren moet sorteren naar de sortering van de meest recente. Maar volgens mij zit ik veel te moeilijk te denken. Ik kan natuurlijk met een foreach het meest recente jaar pakken en dan de waarden van $results[$year + 1) tonen. Dan heb ik niks nodig van een sortering.quote:Op maandag 25 juli 2011 13:48 schreef Tijn het volgende:
array_multisort() doet in grote lijnen toch wel wat je hebben wil? Misschien dat je er alleen even een functie omheen moet schrijven om te zorgen dat 'ie alleen het meest recente jaar sorteert. Of zie ik iets over het hoofd?
Waar haal je het vandaan? Want als je het uit een DB haalt dan kan het makkelijker opgelost worden. Anders zou ik eens gaan kijken naar je opbouw van je array, want daar kun je volgens mij ook nog een verbeterslag maken.quote:Op maandag 25 juli 2011 13:57 schreef remi1986 het volgende:
[..]
Het probleem is dat hij alle jaren moet sorteren naar de sortering van de meest recente. Maar volgens mij zit ik veel te moeilijk te denken. Ik kan natuurlijk met een foreach het meest recente jaar pakken en dan de waarden van $results[$year + 1) tonen. Dan heb ik niks nodig van een sortering.
EDIT: lang leve de maandag![]()
![]()
![]()
het ligt allemaal iets ingewikkelder dan dit.quote:Op maandag 25 juli 2011 14:02 schreef A-mineur het volgende:
Waarom doe je allemaal zo moeilijk je kunt toch gewoon in je query orderen, ook op meerdere velden ORDER BY YEAR(date) ASC, name ASC, date desc iets in die trend, dan hoef je niet allemaal in PHP te gaan orderen wat voor PHP dus nietszeggende data is.
Tuurlijk wel, je berekend de resultaten toch, ik zou dit sowieso berekenen met de DB daar is hij nl. voor bedoeld.quote:Op maandag 25 juli 2011 14:08 schreef remi1986 het volgende:
[..]
het ligt allemaal iets ingewikkelder dan dit.
Gebruiker voert een start en eind jaar in.
Vervolgens ga ik met een query met allemaal joins naar andere tabellen de data ophalen die ik nodig heb. Met dit resultaat van die query, vul ik de $results array, omdat de percentages niet in de database staan, maar moeten worden berekend, kan ik daar niet in de query op ordenen.
Zoals in mijn reactie hierboven, staan de percentages niet in de database. Dat wat ik toonde van de $results array is maar een klein stukje. Het is een groot overzicht met allemaal statistieken. Met de ene keer een medewerker als uitgangspunt maar in een ander overzicht het hele bedrijf.quote:Op maandag 25 juli 2011 14:07 schreef Pakspul het volgende:
[..]
Waar haal je het vandaan? Want als je het uit een DB haalt dan kan het makkelijker opgelost worden. Anders zou ik eens gaan kijken naar je opbouw van je array, want daar kun je volgens mij ook nog een verbeterslag maken.
Hoe kan ik met MySQL een percentage berekenen dan? En dan moet het een percentage zijn over de SUM van een aantal kolommen.quote:Op maandag 25 juli 2011 14:11 schreef A-mineur het volgende:
[..]
Tuurlijk wel, je berekend de resultaten toch, ik zou dit sowieso berekenen met de DB daar is hij nl. voor bedoeld.
Tevens bespaart dit je een hoop onnodig rekenwerk in PHP en dataomzetting.
Schaduw array bijhouden waar je percentages aan personen koppelt en deze makkelijk kunt sorterenquote:Op maandag 25 juli 2011 14:11 schreef remi1986 het volgende:
[..]
Zoals in mijn reactie hierboven, staan de percentages niet in de database. Dat wat ik toonde van de $results array is maar een klein stukje. Het is een groot overzicht met allemaal statistieken. Met de ene keer een medewerker als uitgangspunt maar in een ander overzicht het hele bedrijf.
Deel / totaal * 100 (normale percentage berekening lijkt me?)quote:Op maandag 25 juli 2011 14:16 schreef remi1986 het volgende:
[..]
Hoe kan ik met MySQL een percentage berekenen dan? En dan moet het een percentage zijn over de SUM van een aantal kolommen.
Dit is ongeveer vergelijkbaar met de oplossing die ik zelf gaf met de foreach loop. Want als je de volgorde weet van het eerste jaar, kan je ze gewoon benaderen als je de naam weet.quote:Op maandag 25 juli 2011 14:16 schreef Pakspul het volgende:
[..]
Schaduw array bijhouden waar je percentages aan personen koppelt en deze makkelijk kunt sorterenDie zou je nog kunnen opnemen onder $results[jaartal][percentage2medewerker] en dan een array alla: array('85' => 'mark', '98' => 'piet', '65' => 'jan');
Ga eerst eens spelen met je database, want dit kun je perfect daaruit halen. Percentage berekening kun je gewoon in je ORDER statement gooien.quote:Op maandag 25 juli 2011 14:19 schreef remi1986 het volgende:
[..]
Dit is ongeveer vergelijkbaar met de oplossing die ik zelf gaf met de foreach loop. Want als je de volgorde weet van het eerste jaar, kan je ze gewoon benaderen als je de naam weet.
1 | SELECT * FROM `test` ORDER BY (Deel / Totaal) DESC |
Dat is toch niet zo'n probleem? Gewoon met SUM en COUNT de totalen berekenen en dan selecten en ordenen op de waarde / totaal * 100.quote:Op maandag 25 juli 2011 14:16 schreef remi1986 het volgende:
[..]
Hoe kan ik met MySQL een percentage berekenen dan? En dan moet het een percentage zijn over de SUM van een aantal kolommen.
1 2 3 4 5 6 7 8 9 10 11 | SELECT medewerker_naam SUM(getal1) AS getal1 SUM(getal2) AS getal2 SUM(getal3) AS getal3 FROM medewerkers INNER JOIN tabel 1 INNER JOIN tabel 2 INNER JOIN tabel 3 WHERE datum BETWEEN .... AND .. GROUP BY medewerker |
Wat dacht je vanquote:Op maandag 25 juli 2011 14:28 schreef remi1986 het volgende:
De resultaten komen uit koppeltabellen en worden met GROUP BY bij elkaar gevoegd (hiermee krijg ik dus totalen voor in dit geval de medewerker)
Onderstaand de query met Nederlandse namen (kolommen heten anders, maar dit gaat sneller),
[ code verwijderd ]
Om het percentage te berekenen moet ik eerst getal 1 en 2 optellen. Getal 3 / (getal 1+2) * 100 = percentage wat ik nodig heb. Hoe wil dit allemaal in MySQL
1 2 3 4 5 6 7 8 9 10 11 12 | SELECT medewerker_naam SUM(getal1) AS getal1 SUM(getal2) AS getal2 SUM(getal3) AS getal3 AVG (getal1, getal2, getal3) AS gemiddeld FROM medewerkers INNER JOIN tabel 1 INNER JOIN tabel 2 INNER JOIN tabel 3 WHERE datum BETWEEN .... AND .. GROUP BY gemiddeld ASC, medewerker ASC |
1 2 3 4 5 6 7 8 9 10 11 12 | SELECT medewerker_naam SUM(getal1) AS getal1 SUM(getal2) AS getal2 SUM(getal3) AS getal3 getal3 / (getal1+2) * 100 AS percentage FROM medewerkers INNER JOIN tabel 1 INNER JOIN tabel 2 INNER JOIN tabel 3 WHERE datum BETWEEN .... AND .. GROUP BY medewerker |
1 2 | SELECT Naam, SUM(Deel) / SUM(Totaal) * 100 As Percentage FROM `test` GROUP BY Naam ORDER BY Percentage DESC |
quote:
ok dit snap ik. Maar ik moet de volgorde bepalen van de medewerkers hoe deze getoond worden (hoogste percentage in laatste jaar bovenaan). Die ORDER BY gaat dan alleen op als jaar 2011 is (in het eerste voorbeeld dat ik gaf)quote:
ORDER BY Jaartal DESC, Percentage DESCquote:Op maandag 25 juli 2011 14:35 schreef remi1986 het volgende:
[..]
[..]
ok dit snap ik. Maar ik moet de volgorde bepalen van de medewerkers hoe deze getoond worden (hoogste percentage in laatste jaar bovenaan). Die ORDER BY gaat dan alleen op als jaar 2011 is (in het eerste voorbeeld dat ik gaf)
haha je was me voor,quote:Op maandag 25 juli 2011 14:37 schreef Pakspul het volgende:
[..]
ORDER BY Jaartal DESC, Percentage DESC
Als je dingen specifiek tussen 2 jaartallen wilt hebben voeg je er gewoon op het einde aan toe: WHERE YEAR(datum) BETWEEN 2000 AND 2011.quote:Op maandag 25 juli 2011 14:46 schreef remi1986 het volgende:
hmm het zal wel aan de maandag liggen, dus wellicht nog een domme opmerking
Maar mijn uiteindelijke doel is een tabel met een overzicht van alle jaren naast elkaar (onderstaand 2011 en 2010, maar dit kunnen er 10 zijn (dus tot 2001 terug).
2011 2010
Jan (getal1+2), getal 3, percentage (getal1+2), getal 3, percentage
Klaas (getal1+2), getal 3, percentage (getal1+2), getal 3, percentage
Piet (getal1+2), getal 3, percentage (getal1+2), getal 3, percentage
Volgens mij gaat dat niet goedkomen, aangezien je dit niet kan doen zonder eerst een array voor een bepaald jaar te maken. Of zit ik nu weer helemaal verkeerd te denken?
EDIT: Zou een tabel moeten voorstellen maar de jaren komen elk dus boven (getal 1 +2 etc...)
Ja dat klopt, maar dan krijg ik de resultaten verticaal terug en niet horizontaal zoals dus zou moeten.quote:Op maandag 25 juli 2011 14:50 schreef A-mineur het volgende:
[..]
Als je dingen specifiek tussen 2 jaartallen wilt hebben voeg je er gewoon op het einde aan toe: WHERE YEAR(datum) BETWEEN 2000 AND 2011.
Als je ze horizontaal wil maken zul je dus de rijen per jaar jaar voor jaar ophalen.quote:Op maandag 25 juli 2011 14:51 schreef remi1986 het volgende:
[..]
Ja dat klopt, maar dan krijg ik de resultaten verticaal terug en niet horizontaal zoals dus zou moeten.
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |