[SQL] een beslissings-structuur in een query maken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • 107mb
  • Registratie: Juni 2004
  • Laatst online: 19:08
Ik heb een query geschreven die gegevens uit meerdere tabellen aan elkaar koppelt.

De hoofdtabel bevat gegevens omtrent werkelijke activiteiten, die gekoppeld wordt aan een planning:

Tabel_Werkelijk W left outer join tabel_Planning P

Op deze manier kan ik prestaties meten tussen geplande activiteiten en dat wat er daadwerkelijk is uitgevoerd. Planningsrecords hebben een status actief of inactief. Het komt voor dat er aan een werkelijk record meerdere planningrecords gekoppeld zijn. De originele planning is vervangen door een nieuwe planning. De oude planning krijgt dan de status inactief.

Per werkelijk.record kan ik dus de volgende resultaten krijgen:
  • 1 actieve planning
  • 1 actieve planning en 1 inactieve planning
  • 1 inactieve planning
In het laatste geval zit dus het probleem. Om toch gegevens te krijgen wil ik dat indien er alleen een inactieve planning aanwezig is, deze toch meegenomen wordt in het overzicht. Als ik ga filteren op planning.actief = true dan mis ik alle plangegevens omtrent werkelijke records die alleen een inactieve planning hebben.

Ik wil graag een query schrijven die het volgende gedrag heeft
  • 1 actieve planning --> koppel de actieve planning record aan het werkelijke record.
  • 1 actieve planning en 1 inactieve planning --> koppel de actieve planning record aan het werkelijke record.
  • 1 inactieve planning --> koppel de inactieve planning record aan het werkelijke record.
Ik heb dus zelf zitten denken om dit het volgende te realiseren.
  • Tel het aantal planning.records per werkelijk.record
  • Indien het 1 planning is, geef deze planning weer, ongeacht de status
  • Zijn het twee planningen, geef alleen de actieve planning weer.
Ik zou dus niet weten hoe ik dit in SQL kan bereiken. Wie helpt?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Het is me niet helemaal duidelijk wat je nou precies wil, maar met CASE WHEN <expression> THEN ... ELSE ... END zou je een eind moeten komen volgens mij. En anders, in mijn interpretatie-B, is dit iets voor de presentatielaag en helemaal niets wat je in SQL wil oplossen.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Stel je hebt 'A' voor actief en 'I' voor inactief:
where p.status = (select min(p2.status) from planning p2 where ...join naar hoofdquery...)

Who is John Galt?


Acties:
  • 0 Henk 'm!

  • 107mb
  • Registratie: Juni 2004
  • Laatst online: 19:08
misschien kan ik het zo verduidelijken:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Select Werkelijk.id
   Werkelijk.klant
   Werkelijk.uren
   Werkelijk.datumuitgevoerd
   Werkelijk tarief
   Planning.uren
   Planning.tarief
   Planning.datumuitvoering
   Planning.status

From werkelijk

Left outer join planning
On werkelijk.klant = planning.klant


Mogelijk Resultaat

KlantW urenW datumW tariefP urenP datumactief
0000110 uur18-01-201050 euro12 uur10-01-2010true
0000220 uur20-01-201050 euro20 uur20-01-2010false
0000225 uur25-01-201050 euro22 uur22-01-2010true
0000325 uur25-01-201050 euro22 uur22-01-2010false


klant 1 en 3 moeten weergegeven worden, en van klant 2 alleen de actieve planning.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Ik zou dit toch vooral op gaan lossen in de presentatielaag of tijdens het uitlezen. Door een simpele order by wordt de query simpel en het uitlezen simpel.

In SQL is het veel lastiger om 'verticale' bewerkingen uit te voeren ipv 'horizontale'.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 16:44

The Eagle

I wear my sunglasses at night

Janoz schreef op vrijdag 09 juli 2010 @ 11:59:
Ik zou dit toch vooral op gaan lossen in de presentatielaag of tijdens het uitlezen. Door een simpele order by wordt de query simpel en het uitlezen simpel.

In SQL is het veel lastiger om 'verticale' bewerkingen uit te voeren ipv 'horizontale'.
Dat laatste valt wel mee, je moet alleen het trucje even kennen ;)
Ik werk dagelijke met PeopleSoft, en dat draait zo ongeveer op dit mechanisme, dat men "effective dating", oftewel ingangsdatums, noemt.
Denk dat je met onderstaande wel wat zult kunnen...het maakt iig het principe duidelijk :)
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Select Werkelijk.id
   Werkelijk.klant
   Werkelijk.uren
   Werkelijk.datumuitgevoerd
   Werkelijk tarief
   Planning.uren
   Planning.tarief
   Planning.datumuitvoering
   Planning.status

From werkelijk, planning

where werkelijk.plant = planning.klant
and planning.datumuitvoering =
   (select max(p.datumuitvoering) from planning p
    where p.plant = planning.klant
    and p.datumuitvoering <= werkelijk.datumuitgevoerd
    and p.status='Actief')
or planning.datumuitvoering =
   (select p.datumuitvoering from planning p
    where p.plant = planning.klant
    and p.datumuitvoering = werkelijk.datumguitgevoerd
    and p.status='Inactief')


In het eerste deel selecteer je de meest recente actieve planning voor je klant. Logischerwijs moet deze datum kleiner of gelijk zijn aan de datum van uitvoering - aan en planning achteraf heb je niks, da's slechts een opsomming van de taken zoals ze gelopen zijn ;) Aangezien er tevens geldt dat een klant minimaal 1 actieve planning heeft (je eerste bullet) wordt deze ook in deze selectie meegenomen.

In het tweede deel selecteer je vervolgens alleen die planningen waarvan de datum wel in de planningentabel voorkomt maar inactief is.
Volgens mij ben je er dan wel :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)

Pagina: 1