Page 1 of 2 1 2 LastLast
Results 1 to 15 of 21

Thread: Selectie uit 2 tabellen waarbij uit tabel 2 max waardes

  1. #1

    Selectie uit 2 tabellen waarbij uit tabel 2 max waardes

    Onderstaande query gebruik ik om uit tabel 1 het mwnummer op te halen en uit tabel 2 het aantal uren per week dat wordt gewerkt en de ingangsdatum daarvan.

    SQL Code:
    1. SELECT
    2.   RELATIE.dossiernum,
    3.   ALURENPERDAG.jaar,
    4.   ALURENPERDAG.pernr,
    5.   ALURENPERDAG.week,
    6.   sum(ALURENPERDAG.zodag + ALURENPERDAG.madag + ALURENPERDAG.didag +
    7.       ALURENPERDAG.wodag + ALURENPERDAG.dodag + ALURENPERDAG.vrdag + ALURENPERDAG.zadag) AS uren
    8. FROM
    9.   ALURENPERDAG
    10.   INNER JOIN ALUMEDEWERKER ON ALURENPERDAG.mdwnr = ALUMEDEWERKER.mdwnr AND ALURENPERDAG.jaar = (SELECT
    11.     Max(ALURENPERDAG.jaar)
    12.   FROM
    13.     ALURENPERDAG) AND
    14.   ALURENPERDAG.week = (SELECT
    15.     Max(ALURENPERDAG.week)
    16.   FROM
    17.     ALURENPERDAG) AND
    18.   ALURENPERDAG.pernr = (SELECT
    19.     Max(ALURENPERDAG.pernr)
    20.   FROM
    21.     ALURENPERDAG)
    22.   INNER JOIN RELATIE ON ALUMEDEWERKER.relnr = RELATIE.relnr
    23. GROUP BY  
    24.   RELATIE.dossiernum,
    25.   ALURENPERDAG.jaar,
    26.   ALURENPERDAG.pernr,
    27.   ALURENPERDAG.week


    Ik krijg nu echter maar 1 resultaat terug dat van de medewerker waarbij het jaar en de week en de periode het hoogste is terwijl ik op zoek ben naar het laatste jaar/periode/week per medewerker.
    Last edited by GolezTrol; 12-Aug-17 at 12:27.

  2. #2
    Volgens mij heb je hier een gecorreleerde query voor nodig.

    p.s. als je een SQL formatter gebruikt wordt het een stuk leesbaarder.

  3. #3
    SQL formatter had ik gebruikt maar dat ging niet zoals verwacht.

    Kun je iets meer zeggen over hoe ik deze gecorreleerde query kan gebruiken? Heb me ingelezen maar kom er toch nog niet uit.

  4. #4
    Je kunt het beste code-tags om een query zetten.
    Zoals onder.

    Wat ik niet helemaal begrijp... hoe ziet die ALURENPERDAG tabel eruit.
    Wat sla je daar per record op.
    Want ik zie een weeknummer en alle uren voor alle dagen.
    Is dat dan 1 record per week? (want dan heb je volgens mij geen sum en group by nodig).

    Is dat 1 record per dag dan had je natuurlijk geen zodag, madag e.d. nodig.
    Ik ben dus een beetje onzeker over de efficiency van je tabel-opbouw.


    SQL Code:
    1. SELECT
    2.   RELATIE.dossiernum,
    3.   ALURENPERDAG.jaar,
    4.   ALURENPERDAG.pernr,
    5.   ALURENPERDAG.week,
    6.   sum(ALURENPERDAG.zodag + ALURENPERDAG.madag + ALURENPERDAG.didag +
    7.       ALURENPERDAG.wodag + ALURENPERDAG.dodag + ALURENPERDAG.vrdag + ALURENPERDAG.zadag) AS uren
    8. FROM ALURENPERDAG
    9. INNER JOIN ALUMEDEWERKER ON ALURENPERDAG.mdwnr = ALUMEDEWERKER.mdwnr
    10.    AND ALURENPERDAG.jaar = (SELECT Max(ALURENPERDAG.jaar) FROM ALURENPERDAG)
    11.    AND ALURENPERDAG.week = (SELECT Max(ALURENPERDAG.week) FROM ALURENPERDAG)
    12.    AND ALURENPERDAG.pernr = (SELECT Max(ALURENPERDAG.pernr) FROM ALURENPERDAG)
    13. INNER JOIN RELATIE ON ALUMEDEWERKER.relnr = RELATIE.relnr
    14. GROUP BY  
    15.   RELATIE.dossiernum,
    16.   ALURENPERDAG.jaar,
    17.   ALURENPERDAG.pernr,
    18.   ALURENPERDAG.week

    terwijl ik op zoek ben naar het laatste jaar/periode/week per medewerker.
    Ik neem even aan, omdat de tabel alurenPERDAG heet, dat tabel dus 0 uur voor zodag heeft op maandag, dinsdag enzovoort. (In welk geval je je tabel beter anders op had kunnen bouwen)

    Is dit dan niet wat je wilt?

    SQL Code:
    1. SELECT
    2.   RELATIE.dossiernum,
    3.   ALURENPERDAG.jaar,
    4.   ALURENPERDAG.pernr,
    5.   ALURENPERDAG.week,
    6.   sum(ALURENPERDAG.zodag + ALURENPERDAG.madag + ALURENPERDAG.didag +
    7.       ALURENPERDAG.wodag + ALURENPERDAG.dodag + ALURENPERDAG.vrdag + ALURENPERDAG.zadag) AS uren
    8. FROM ALURENPERDAG
    9. LEFT JOIN ALUMEDEWERKER ON ALURENPERDAG.mdwnr = ALUMEDEWERKER.mdwnr
    10. LEFT JOIN RELATIE ON ALUMEDEWERKER.relnr = RELATIE.relnr
    11. WHERE ALURENPERDAG.jaar = (SELECT Max(ALURENPERDAG.jaar) FROM ALURENPERDAG)
    12.      AND ALURENPERDAG.week = (SELECT Max(ALURENPERDAG.week) FROM ALURENPERDAG)
    13. GROUP BY  
    14.   RELATIE.dossiernum,
    15.   ALURENPERDAG.jaar,
    16.   ALURENPERDAG.pernr,
    17.   ALURENPERDAG.week

    Dit zou echter wel alleen voor ALLE werknemers de laatste week geven. Niet de laatste week van die werknemer zelf. Maar dit was in jouw oorspronkelijke query ook zo. Als je dat niet wilt had je in de SELECT Max() ook de controle op werknemer weer op moeten nemen.

    Tevens had je een Max(ALURENPERDAG.pernr) opgenomen in je INNER wat natuurlijk resulteert in alleen resultaten voor het hoogste pernr (ook niet wat je wilde).

  5. #5
    De tabellen zijn niet door mij gemaakt maar zijn van een database aangeleverd door ontwikkelaar van software. Daar kan ik dus weinig aan veranderen.
    Als ik de SQL code gebruik die jij voorsteld krijg ik 1 record terug. Van de medewerker met max jaar, max periode en max week.

    De ALURENPERDAG is een tabel waarin ik per medewerker per jaar/periode/week aangeef wat de uren per dag zijn dat gewerkt moet worden. Als dit wijzigt komt er een nieuw record bij. Ik wil altijd het nieuwste record hebben (dus hoogste jaar, periode en week). En dit dan per medewerker opvragen.

  6. #6
    Quote Originally Posted by Pascal G++ View Post
    De ALURENPERDAG is een tabel waarin ik per medewerker per jaar/periode/week aangeef wat de uren per dag zijn dat gewerkt moet worden. Als dit wijzigt komt er een nieuw record bij. Ik wil altijd het nieuwste record hebben (dus hoogste jaar, periode en week). En dit dan per medewerker opvragen.
    O, dit is dus niet een record van werkelijk gemaakte uren?

    Wil je alleen de totaal uren van week 30 per werknemer (om maar wat te noemen)?

    Waarom wilde je sum() doen? Je wilt toch alleen het laatste record doen. Dan is zodag+madag etc. voor dat record toch voldoende? Je hebt geen group nodig toch? Als je een group by doet dan worden de uren van twee zelfde weken bij elkaar opgeteld. Maar dat wil je dan toch niet?

    Als je voor werknemer 5 geen record hebt voor week 30, wat wil je dan? Werknemer 5 weglaten, op 0 zetten of de laatste weeknr (b.v. Wk 25) voor werknemer 5 weergeven?

    Nu is dat nogal onduidelijk.
    Last edited by rvk; 08-Aug-17 at 17:35.

  7. #7
    Per medewerker is er een regel waarin de uren voor zo ma di wo do vr za worden ingevuld. Het jaar, week en periode is de ingangsdatum vanaf dit nieuwe aantal uren geld. Het kan dus zijn dat een medewerker 3 regels heeft en een ander maar 1 regel. Ik wil per medewerker de meeste actuele regel ophalen. Het kan niet voorkomen dat een medewerker geen record heeft.

  8. #8
    Dan moet je dus sowieso niet met group by end sum werken.

    Je zegt elke werknemer heeft een record maar ik neem aan dat dat niet voor elke week hoeft te zijn. Zo kan werknemer 1 laatste record voor week 35 zijn en het laatste record voor werknemer 2 week 30, neem ik aan?

    (Zit even niet achter de computer dus kan geen voorbeeld maken)

  9. #9
    Begrijp ik je goed dat je per medewerker de meest recente gegevens wilt ophalen en dat je tabel ook de historie bevat/kan bevatten?

    Misschien dat de volgende stappen een oplossing zijn.

    1) Combineer jaar + week tot een datum (weet niet echt wat pernr doet, dus misschien is het niet mogelijk) je kunt dat de meeste recente datum ophalen.

    2) Probeer uit alleen de ALURENPERDAG één resultaat te krijgen voor één ALURENPERDAG.mdwnr in je WHERE

    3) Als dat lukt kun je volgens mij een gecorreleerde query schrijven, waarbij de query onder punt 2 de subquery is.

  10. #10
    Heb je een unieke ID op die ALURENPERDAG zitten? Want als er twee records per week (zelfde week) kunnen zijn zul je de laatste moeten kunnen selecteren. Dat kan via een ID die incremental is of via een datum+tijd veld van toevoeging. Alleen maar jaar en week combineren werkt niet want dan weet je dus nog niet welke de laatste was.

    Je kunt dan inderdaad via een subject in de WHERE of via een left join de MAX() van die ID ophalen en alleen door weergeven.

    Leg ook eens even de RELATIE.dossiernum uit? Wat heeft dit met werknemers te maken? Als dit gewoon een project relatie is dan lijkt mij een left join ook voldoende. En pernr? Of is pernr gewoon een personeel nummer voor weergave? (Wat is dan het verschil tussen pernr en mdwnr?)

    Je ziet, een goede tabel omschrijving is echt nodig om een probleem te beschrijven en een goede oplossing te maken.

  11. #11
    Heb de indruk dat pernr periode nummer is.

  12. #12
    Ben opnieuw begonnen. Heb nu zelf tabellen aangemaakt en daarin het jaar + week gebruikt om de datum te bepalen en een extra kolom toegevoegd met daarin de datum. Dus daar waar datum is max is het record dat ik wil hebben.
    Ik ben bekend met de MAX mogelijkheid in SQL maar als ik de volgende code gebruik:

    Code:
    SELECT
      [BIPS.MWTarief].mwnummer,
      Max([BIPS.MWTarief].startdatum) AS Max_startdatum,
      [BIPS.MWTarief].tarief
    FROM
      [BIPS.MWTarief]
    GROUP BY
      [BIPS.MWTarief].mwnummer,
      [BIPS.MWTarief].tarief
    Dan zie ik nog steeds 2 records per gebruiker omdat het tarief niet hetzelfde is. Hoe kan ik een max gebruik om een complete regel op te halen waar de datum is max.

  13. #13
    Code:
    [BIPS.MWTarief].tarief
    probeer dit eens weg te halen uit de select.

  14. #14
    Ja, maar ik denk dat het juist de bedoeling is om dat tarief ook zichtbaar te hebben

    Misschien kun je zoiets doen:
    SQL Code:
    1. SELECT
    2.   mwnummer,
    3.   max_startdatum,
    4.   tarief
    5. FROM mwtarief m
    6. INNER JOIN (
    7.   SELECT mwnummer, MAX(startdatum) AS maxdate
    8.   FROM mwtarief
    9.   GROUP BY mwnummer
    10. ) AS x ON x.mwnummer=m.mwnummer AND x.maxdate=m.startdatum
    Dan kun je in de eerste SELECT gewoon alle velden gebruiken die je wilt hebben en krijg je die van het laatste record.

  15. #15
    Sommige mensen denk ook alleen aan geld

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •