/ Forside/ Teknologi / Udvikling / SQL / Spørgsmål
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
betingelse på attributter
Fra : mikkel1
Vist : 473 gange
220 point
Dato : 22-06-03 10:09

Hej
Jeg har en tabel A i den skal jeg bruge værdierne b hvis de opstår i 4 rækker i træk, jeg ved ikke hvad jeg skal skrive i where delen så mit spørsmål er hvordan vil den query se ud?

****
select b
from A
where

Tak Mikkel

 
 
Kommentar
Fra : mikkel1


Dato : 22-06-03 12:40

Hej igen
jeg har ikke furlemeret mig helt klart, tabellen ser således ud:

Tabel A
{
id
navn
...
kørsel   
}

Jeg skal en query der kan finde id navn og kørsel hvis attributten kørsel får værdien 'b' 4 gange i træk.
jeg bruger MSSQL server 2000
Tak
Mikkel

   


Accepteret svar
Fra : pmbruun

Modtaget 220 point
Dato : 23-06-03 08:46

Hej Mikkel,

Når du skriver "i træk" er det ikke meningsfuldt, da rækkerne i en tabel ikke ligger i nogen bestemt orden. For at det skal give mening, er du nødt til at fortælle, hvad du *sorterer* på. Det kunne f.eks. være "id". Det, du vil søge på er så måske, om der er mere end 4 rækker med samme id, der har samme værdi for attributten "b".

select distinct id, navn, kørsel from A a1
where ( select count(b) from A a2
where a2.id = a1.id and a2.b = a1.b
) >= 4
go

Værre bliver det, hvis du med "i træk" mener, at der er et eller andet sekvensnummer eller tidsstempel, som vokser for hver ny række, og det du vil er, at finde alle forekomster hvor fire på hinanden følgende sekvensnumre har samme værdi for b.

Jeg kan ikke lige se, om noget sådant kan formuleres i SQL - ellers må du bruge en stored procedure...

Peter




Kommentar
Fra : MKC


Dato : 23-06-03 09:22

Hej
Jeg er lige logge in på en anden konto.
Jeg har en tabel der sorter på ID og Dato hvis attributten kørsel indeholder 4 x 'b' for samme ID og på samme dato så skal jeg tage sum på en attribut der hedder 'Km'

tak
Mikkel

Kommentar
Fra : pmbruun


Dato : 23-06-03 10:27

Så skulle princippet i ovenstående query virke, men du får lige lidt mere kompleksitet fordi du skal summere km feltet.

Du skal bare lige sætte kriteriet for datoen ind også. Jeg har jo ikke den præcise tabel, men noget i retning af:

select id, dato, sum(km) from a a1
where (select count(b) from a a2
where a2.id = a1.id and a2.dato = a1.dato and a2.b = a1.b) >= 4
group by id, dato
go


Kommentar
Fra : MKC


Dato : 23-06-03 11:31

Hej Igen
Jeg får stadig en underlig fejl, jeg har indsat den orginale kode jeg får følgende fejl:

***********
Server: Msg 156, Level 15, State 1, Line 10
Incorrect syntax near the keyword 'AND'.
Server: Msg 170, Level 15, State 1, Line 12
Line 12: Incorrect syntax near '>'.
***********
Fejlen er i linien "AND (select count(S)" S er en varchar måske der for


SELECT DISTINCT CNR,ID,NR,DATO,
(SELECT SUM(TIMER)
FROM FRAVAERSOPLYSNING WS
WHERE WS.NR = W.NR
   AND WS.CNR = W.CNR
   AND WS.KODEID = W.KODEID
   AND WS.DATO = W.DATO
   AND FRAKODEID = 'S') AS S
   AND (select count(S)
      where (WS.APOTEKNR = W.APOTEKNR and WS.STILLINGSKODEID = W.STILLINGSKODEID
    and WS.OPRET_DATO = W.OPRET_DATO) >= 4,

Tak igen

Kommentar
Fra : pmbruun


Dato : 23-06-03 11:53

Sjusk!

Der står ") AS S" og blafrer midt imellem en masse AND udtryk.
Du mangler FROM... efter "select count(S)".
Det hele ender også lidt underligt efter ">= 4," - der må mangle noget.
Det er ikke "pæn SQL" at indlejre select's i FROM listen - du får for mange tabelscan og forvirrer optimizeren.

Hvis du skal bruge yderligere hjælp med almindelig SQL syntaks, må du stille et nyt spørgsmål. Men gør dig lige lidt mere umage selv før du farer tilbage og siger "hjælp, jeg kan ikke finde ud af det!". Jeg vil gerne hjælpe dig med gode ideer og svære problemer - men til gengæld må jeg som minimum forlange, at du ikke sjusker med mine svar!

Peter


Kommentar
Fra : MKC


Dato : 23-06-03 12:02

Det jeg vil opnå er : sum på timer, hvis kodeID har værdien 'S' 4 gange i træk (alså 4 datoer)

Mikkel

Kommentar
Fra : pmbruun


Dato : 23-06-03 12:12

Nu må du altså bestemme dig til om det er timer eller km, der skal summeres!
Lad være med at have select i from-listen.
Brug "group by" som vist.
Brug FRAKODEID = 'S' i stedet for a1.b = a2.b

Prøv selv. Start med det, jeg skrev ovenfor. Prøv at *forstå* svaret, i stedet for at panikke og gøre noget tilfældigt.

Lav evt. en lille testtabel med nogle simple værdier, og prøv mit query. Det har jeg selv gjort for at være sikker på at det jeg sendte virkede. Det tager ca. 3 minutter.

Så kan det være du lærer noget! Er det ikke det, der er meningen?

Peter


Kommentar
Fra : MKC


Dato : 23-06-03 12:20

Hej Peter
Jeg prøver ikke at lave sjusk, jeg kigger lidt mere på ellers opretter jeg en ny tråd

Tak for hjælpen.


Kommentar
Fra : MKC


Dato : 23-06-03 15:31

Jeg kan først lukke dette spørsmål i overmorgen Peter vil få alle point, jeg har stilliet et nyt spørsmål

Tak Mikkel


Godkendelse af svar
Fra : mikkel1


Dato : 23-06-03 21:54

Tak for svaret pmbruun.

                        

Du har følgende muligheder
Eftersom du ikke er logget ind i systemet, kan du ikke skrive et indlæg til dette spørgsmål.

Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
Søg
Reklame
Statistik
Spørgsmål : 177420
Tips : 31962
Nyheder : 719565
Indlæg : 6407881
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste