Avatar billede mortency Nybegynder
28. september 2004 - 16:39 Der er 10 kommentarer og
2 løsninger

Tricky SQL

Jeg skal hente ut følgende fra databasen...

Det skal lages en rapport som lister opp alle kjennetegn(regnr) med antall dager de har ligget aktive i databasen. Rapporten skal kjøres på et dato utvalg.

Jeg klarer ikke å skjønne om det er mulig sånn som databasen er bygget opp.

Databasediagramet kan sees her http://www.cyren.no/diagram.gif

//Håper det er noen der ute som kan hjelpe meg!
//Morten
Avatar billede Syska Mester
28. september 2004 - 17:01 #1
altså antal dage en bil har været leget ud? hvis, hvordan bliver det skrevet i databasen?
Avatar billede veronica Nybegynder
28. september 2004 - 17:13 #2
Hejsa,

Selve dato-halløjet må være noget i stil med det her:

-- snip --

SET dateformat dmy

Declare @dato1 datetime
Declare @dato2 datetime

SET @dato1 = '1-jan-2003'
SET @dato2 = '31-april-2003'

select
regnr,
ArsModell,
Motorstorrelse,
Listepris,
PeriodePremie,
DateDiff(d, OprettetDato, getdate()) as DageSidenOprettelse,

FROM
tblBiler

WHERE
OprettetDato BETWEEN @dato1 AND @dato2

-- snip --

Derimod har jeg svært ved at overskue logikken bag tabellen tblLoggEndringer, og kan derfor nok ikke hjælpe dig med at få relationerne med (Fabrikat, model, etc..) med mindre du kender logikken ??
/Veronica
Avatar billede mortency Nybegynder
29. september 2004 - 09:11 #3
//Buzzzz

Når bilen blir lagt inn i databasen så legges det kun data i tblbiler.

Følgende data blir lagt inn tblbiler:
        oRS.AddNew
        oRs("FKEier") = strEier
        oRS("Regnr") = strRegNr
        oRS("FKFabrikat") = strFabrikat
        oRS("FKModell") = strModell
        oRS("FKType") = strType
        oRS("Arsmodell") = strArsmodell
        oRS("MotorStorrelse") = strMotor
        oRS("ListePris") = strListePris
        oRS("FKPremie") = strPremie
        oRS("PeriodePremie") = Clng(strPeriodePremie)
        oRS("FKBRAvdeling") = strKunde
        oRS("OpprettetDato") = now()
        oRS("FKRegAv") = Session("BRID")
        oRS("GjelderFra") = strGjelderFra
        oRS("Aktiv") = "JA"
        oRS("EndretDato") = date()
        oRS.Update

Når bilen blir slettet legges følgende data inn i tblbiler:
    oRS.Find "BID='" & strBID & "'"
    oRS("Aktiv") = "NEI"
    oRS("SlettetAv") = Session("BRID")
    oRS("SlettetDato") = now()
    oRS("SiOppForsikringFra") = txtDato
    oRS("EndretDato") = date()
    oRS.update

Og det bli lagt i loggen:
    oRs("SlettetFKBID") = strBID
    oRs("SlettetEier") = strEID
    oRS("SlettetRegnr") = strRegNr
    oRS("SlettetAvdeling") = strKunde
    oRS("SlettetAv") = Session("BRID")
    oRS("SlettetDato") = now()
    oRS("SlettetSiOppForsikringFra") = txtDato

Se på diagrammet (nytt) http://www.cyren.no/diagram2.gif

Det vil si at når man sletter en bil så settes den til inaktiv i tblbiler. Man kan så registrere regnr på nytt men bilen får en ny ID.
Avatar billede mortency Nybegynder
29. september 2004 - 09:18 #4
//veronica

Du trenger ikke å bry deg om tblloggendringer den viser kun hva gamle data og nye data har blitt endret til. Den skal ikke brukes. Tabellene som skal brukes mener jeg bør være tblbiler, tblloggslettinger.

Se kommentaren over.

//Morten
Avatar billede Syska Mester
29. september 2004 - 11:50 #5
altså noget ala
Bil med regnr. RT32454 har været aktiv i 90 dage fra 15-12 2002

og start dato er så før overstående dato?

Det er sådan du vil have det ud?
Avatar billede mortency Nybegynder
29. september 2004 - 12:31 #6
//Buzzz

Ja det er sånn jeg vil ha det ut, men det kan godt hende at en bil har blitt slettet (dvs at den er inaktiv) Så blir den igjen registrert på nytt. En bil kan inn og utmeldes flere ganger.

Så når man registrerer en ny bil så sjekker den om regnr er i databasen og om den er aktiv. Hvis den er aktiv så kan ikke bilen registreres. Hvis ikke lages det en ny post.

CASE 1
Hvis bil med regnr TR32454 ble lagt inn 01.01.2003 så slettet 01.02.2003. Så har den vært aktiv i 31 dager.

Videre så har den blitt registrert på nytt med ny BID den 29.09.2003 og den er ikke slettet så er den vært aktiv 31 dager + 29.09.2003 til idag.

CASE2
Hvis bil med regnr TR32459 ble lagt inn 01.01.2003 så slettet 01.02.2003. Så har den vært aktiv i 31 dager.

Videre så har den blitt registrert på nytt med ny BID den 31.12.2003 og den er slettet igjen fra 05.01.2004 så er den vært aktiv 31 dager + 6 dager.

Skjønner du hva jeg egentlig mener?

//Morten
Avatar billede Syska Mester
29. september 2004 - 12:50 #7
ja, nu er jeg klar over hvad du mener.....

og tror godt det kan lade sig gøre, hvis du sender en del af databasen + nogel få posts i tblBiler, da jeg ikke kan se hvad de andre skal bruges til i denne her sammenhæng....

Er ved at lære SQL så dette her lyder som en god opgave.... som helt sikkert kan løses
Avatar billede Syska Mester
29. september 2004 - 12:52 #8
ups, du kan sende databasen + et par posts til sql@bigbabies.dk sådan at jeg kan importere den i min SQL database
Avatar billede mortency Nybegynder
29. september 2004 - 13:26 #9
Hva er det du ikke kan se?  --> da jeg ikke kan se hvad de andre skal bruges til i denne her sammenhæng....
Avatar billede Syska Mester
30. september 2004 - 08:48 #10
Det hele står jo i "tblBiler" tabelen, de andre er jo kun ekstra informationer som jeg ikke lige kan se hvad jeg kan bruge til, om hvad afdeling de hører til etc. eller hvordan jeg skal forklare det.......
Avatar billede mortency Nybegynder
30. september 2004 - 12:54 #11
//buzzz

Framgangsmåten sql`en må lages på er følgende. tror jeg......

SET dateformat dmy

Declare @dato1 datetime
Declare @dato2 datetime

SET @dato1 = '01-01-2003 00:00:00'
SET @dato2 = '31-12-2003 23:59:59'

SELECT
tblbiler.bid,
tblbiler.regnr,
tblbiler.SiOppforsikringFra
tblavdeling.ANavn,
DateDiff(d, tblbiler.OprettetDato, tblbiler.SiOppforsikringFra) as DageSidenOprettelse

FROM
tblBiler,tblAvdeling

WHERE
OprettetDato BETWEEN @dato1 AND @dato2 AND tblbiler.FKBrAvdeling=tblavdeling.AID



Dette må legges inn i spørringen

Hvis tblbiler.bid sjekker mot tblloggslettinger.SlettetFKBid er <null> da er
DageSidenOprettelse = DateDiff(d, OprettetDato, getdate()) as DageSidenOprettelse

Hvis tblbiler.bid sjekker mot tblloggslettinger.SlettetFKBid er ikke <null> da er
DageSidenOprettelse = DateDiff(d, OprettetDato, tblbiler.SiOppforsikringFra) as DageSidenOprettelse

da må den videre sjekke regnr om det er registrert flere ganger og liste ut alle periode den eventuelt er lagt inn.
Avatar billede mortency Nybegynder
30. september 2004 - 16:03 #12
Det ble løst på følgende måte:

SELECT DISTINCT BID,Regnr,ANavn,GjelderFra,SiOppForsikringFra,Aktiv,CASE WHEN SiOppForsikringFra is null THEN DateDiff(d, GjelderFra, getdate()) ELSE DateDiff(d, GjelderFra, SioppForsikringFra) END AS AntallDager FROM tblbiler,tblAvdeling WHERE FKBRAvdeling=AID AND gjelderfra BETWEEN '01-01-2004 00:00:00' AND '01-06-2004 23:59:59' ORDER BY ANAVN ASC
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester