/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
SQL problemer
Fra : Martin Møller Bæk


Dato : 18-09-01 19:44

Jeg har et problem vedrørende udtræk af data en tabel.
Tabellen ser sådan ud:

Navn Uge Timer
x1 y1 t1
x2 y2 t2
.... ... ...

Jeg vil gerne lave en forespørgsel, hvor jeg udtrækker følgende

Navn Timer i uge a Timer i uge a+1 Timer i uge a +
2

hvor a indtastes, når SQL'en fyres af.
Hvis der kun var et (kendt) navn, ville det ikke være så svært
men der er flere navne. Primær-nøglen er (Navn,Uge)

Hvordan gør jeg. Jeg har prøvet mig frem, men kan ikke hitte ud af det.

Mvh.
Martin M. Bæk



 
 
Nis Jorgensen (18-09-2001)
Kommentar
Fra : Nis Jorgensen


Dato : 18-09-01 20:25

On Tue, 18 Sep 2001 20:43:57 +0200, Martin Møller Bæk
<martin@aflame.dk> wrote:

>Jeg har et problem vedrørende udtræk af data en tabel.
>Tabellen ser sådan ud:
>
>Navn Uge Timer
>x1 y1 t1
>x2 y2 t2
>... ... ...
>
>Jeg vil gerne lave en forespørgsel, hvor jeg udtrækker følgende
>
>Navn Timer i uge a Timer i uge a+1 Timer i uge a +
>2
>
>hvor a indtastes, når SQL'en fyres af.
>Hvis der kun var et (kendt) navn, ville det ikke være så svært
>men der er flere navne. Primær-nøglen er (Navn,Uge)
>
>Hvordan gør jeg. Jeg har prøvet mig frem, men kan ikke hitte ud af det.

Nedenstående skulle give det du beder om, modulo et par ubesvarede
spørgsmål.

SELECT t1.Navn, t1.timer, t2.timer, t3.timer
FROM (tabel as t1 INNER JOIN tabel as t2 ON t1.Navn = t2.Navn AND
t2.uge = t1.uge + 1)
INNER JOIN tabel as t3
ON t1.Navn = t3.Navn AND t3.uge = t1.uge + 2
WHERE
t1.uge = a


Martin Møller Bæk (18-09-2001)
Kommentar
Fra : Martin Møller Bæk


Dato : 18-09-01 21:42

En ting jeg ikke fik sagt var, at ikke alle uger findes nødvendigvis i
tabellen.
Nedenstående kode virker kun, hvis der er anført timer i alle 3 uger (a til
a+2).
(Jeg har afprøvet koden.) Og er der ikke anført timer i en uge, skal denne
sættes til 0.
Nogen der har en løsning på dette?

/Martin M. Bæk


Nis Jorgensen wrote:

> On Tue, 18 Sep 2001 20:43:57 +0200, Martin Møller Bæk
> <martin@aflame.dk> wrote:
>
> >Jeg har et problem vedrørende udtræk af data en tabel....
>
> Nedenstående skulle give det du beder om, modulo et par ubesvarede
> spørgsmål.
>
> SELECT t1.Navn, t1.timer, t2.timer, t3.timer
> FROM (tabel as t1 INNER JOIN tabel as t2 ON t1.Navn = t2.Navn AND
> t2.uge = t1.uge + 1)
> INNER JOIN tabel as t3
> ON t1.Navn = t3.Navn AND t3.uge = t1.uge + 2
> WHERE
> t1.uge = a


Nis Jorgensen (19-09-2001)
Kommentar
Fra : Nis Jorgensen


Dato : 19-09-01 10:14

On Tue, 18 Sep 2001 22:42:06 +0200, Martin Møller Bæk
<martin@aflame.dk> wrote:

>En ting jeg ikke fik sagt var, at ikke alle uger findes nødvendigvis i
>tabellen.
>Nedenstående kode virker kun, hvis der er anført timer i alle 3 uger (a til
>a+2).
>(Jeg har afprøvet koden.) Og er der ikke anført timer i en uge, skal denne
>sættes til 0.
>Nogen der har en løsning på dette?

Manglende data? Så bruger man da bare en OUTER JOIN

SELECT t1.Navn, t1.timer, COALESCE(t2.timer,0), COALESCE(t3.timer,0)
FROM (tabel as t1 LEFT OUTER JOIN tabel as t2 ON t1.Navn = t2.Navn AND
t2.uge = t1.uge + 1)
LEFT OUTER JOIN tabel as t3
ON t1.Navn = t3.Navn AND t3.uge = t1.uge + 2
WHERE
t1.uge = a


Det skulle løse dit problem, modulo de resterende ubesvarede
spørgsmål.

--
Nis

Martin Møller Bæk (19-09-2001)
Kommentar
Fra : Martin Møller Bæk


Dato : 19-09-01 10:32

Nu er det ikke for at være besværlig, men
det virker stadig ikke pga. funktion COALESCE(..)
Jeg bruger MS Acces 2000, og når jeg fyrer sql'en af siger den,
at funktionen COALESCHE(..) ikke er defineret.
Øh, hvad gør jeg så?

/Martin

Nis Jorgensen wrote:

> Manglende data? Så bruger man da bare en OUTER JOIN
>
> SELECT t1.Navn, t1.timer, COALESCE(t2.timer,0), COALESCE(t3.timer,0)
> FROM (tabel as t1 LEFT OUTER JOIN tabel as t2 ON t1.Navn = t2.Navn AND
> t2.uge = t1.uge + 1)
> LEFT OUTER JOIN tabel as t3
> ON t1.Navn = t3.Navn AND t3.uge = t1.uge + 2
> WHERE
> t1.uge = a
>
> Det skulle løse dit problem, modulo de resterende ubesvarede
> spørgsmål.
>
> --
> Nis

--
Name: Martin Møller Bæk
Phone: 77 42 47 04
Mobil: 24 82 32 94
E-mail: martin@aflame.dk
Web: http://www.aflame.dk



Nis Jorgensen (19-09-2001)
Kommentar
Fra : Nis Jorgensen


Dato : 19-09-01 12:03

On Wed, 19 Sep 2001 11:32:01 +0200, Martin Møller Bæk
<martin@aflame.dk> wrote:

>Nu er det ikke for at være besværlig, men
>det virker stadig ikke pga. funktion COALESCE(..)
>Jeg bruger MS Acces 2000, og når jeg fyrer sql'en af siger den,
>at funktionen COALESCHE(..) ikke er defineret.
>Øh, hvad gør jeg så?

Det var så ubesvaret spørgsmål nummer to ... M$ har valgt ikke at
implementere COALESCE i Access. Derfor må du bruge noget andet, fx

SELECT t1.Navn, t1.timer, Nz(t2.timer), Nz(t3.timer)
FROM (tabel as t1 LEFT OUTER JOIN tabel as t2 ON t1.Navn = t2.Navn AND
t2.uge = t1.uge + 1)
LEFT OUTER JOIN tabel as t3
ON t1.Navn = t3.Navn AND t3.uge = t1.uge + 2
WHERE
t1.uge = a;

Det sidste spørgsmål er selvfølgelig: Hvad hvis rækken med uge=a
mangler (men uge=a+1 eller uge=a+2 findes)

Svaret på dette spørgsmål (og løsningen af eventuelle problemer i
forbindelse hermed) overlades til læseren som en opgave.


Martin Møller Bæk (20-09-2001)
Kommentar
Fra : Martin Møller Bæk


Dato : 20-09-01 15:37

Har prøvet og prøvet, men jeg kan ikke finde ud af løsningen.
Så please hjælp mig med løsningen. Jeg har hårdt brug for den

Mvh.
Martin M. Bæk

Nis Jorgensen wrote:

> Det var så ubesvaret spørgsmål nummer to ... M$ har valgt ikke at
> implementere COALESCE i Access. Derfor må du bruge noget andet, fx
>
> SELECT t1.Navn, t1.timer, Nz(t2.timer), Nz(t3.timer)
> FROM (tabel as t1 LEFT OUTER JOIN tabel as t2 ON t1.Navn = t2.Navn AND
> t2.uge = t1.uge + 1)
> LEFT OUTER JOIN tabel as t3
> ON t1.Navn = t3.Navn AND t3.uge = t1.uge + 2
> WHERE
> t1.uge = a;
>
> Det sidste spørgsmål er selvfølgelig: Hvad hvis rækken med uge=a
> mangler (men uge=a+1 eller uge=a+2 findes)
>
> Svaret på dette spørgsmål (og løsningen af eventuelle problemer i
> forbindelse hermed) overlades til læseren som en opgave.


Nis Jorgensen (20-09-2001)
Kommentar
Fra : Nis Jorgensen


Dato : 20-09-01 16:05

On Thu, 20 Sep 2001 16:37:06 +0200, Martin Møller Bæk
<martin@aflame.dk> wrote:

>Har prøvet og prøvet, men jeg kan ikke finde ud af løsningen.
>Så please hjælp mig med løsningen. Jeg har hårdt brug for den

Den er heller ikke så ligetil som jeg f'rst troede. Det nemmeste er at
have en tabel eller query der indeholder alle Navne. Den har du
sikkert allerede i en anden tabel - jeg kalder nedenfor tabellerne for
"Navne" og "Uger" (afvigende fra forrige løsning)

SELECT N.Navn, Nz(t1.timer),Nz( t2.timer) , Nz(t3.timer)
FROM (((Navne as N
LEFT OUTER JOIN Uger as t1 ON (N.Navn = t1.Navn AND t1.timer = a))
LEFT OUTER JOIN Uger as t2 ON (N.Navn = t2.Navn AND t2.timer = a + 1))
LEFT OUTER JOIN Uger as t3 ON (N.Navn = t3.Navn AND t3.timer = a + 2))
WHERE t1.Navn Is Not Null OR t2.Navn Is Not Null OR t3.Navn Is Not
Null


Martin Møller Bæk (21-09-2001)
Kommentar
Fra : Martin Møller Bæk


Dato : 21-09-01 18:50

Mange tak for hjælpen, Nis.

/Martin


Nis Jorgensen wrote:

> On Thu, 20 Sep 2001 16:37:06 +0200, Martin Møller Bæk
> <martin@aflame.dk> wrote:
>
> >Har prøvet og prøvet, men jeg kan ikke finde ud af løsningen.
> >Så please hjælp mig med løsningen. Jeg har hårdt brug for den
>
> Den er heller ikke så ligetil som jeg f'rst troede. Det nemmeste er at
> have en tabel eller query der indeholder alle Navne. Den har du
> sik.....


Søg
Reklame
Statistik
Spørgsmål : 177554
Tips : 31968
Nyheder : 719565
Indlæg : 6408852
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste