10. juli 2012 - 10:03Der er
1 kommentar og 1 løsning
Udtræk fra database med håbløs struktur
Jeg har en database, der er temmeligt håbløst struktureret, hvor jeg ikke kan få de relevante data - og kun de relevante data - samlet i en tabel, som er til at arbejde med.
Jeg har to tabeller (Hojde og Vaegt) med cpr, dato og tid (ikke samme felt som dato), hvoraf den ene rummer personhøjde h og den anden personvægt v.
Jeg skal have overfrt cpr, dato, tid samt samhørende værdier (samme registreringsdato og -tid) af h og v for den sidste registrering på den tidligste registreringsdato til tabellen Samlet. Dvs. h og v for min(dato) og på denne dato max(tid).
Det hele er i server 2005, så dato og tid har begge formatet datetime.
Jeg skal lige huske at tilføje, at de registreringer, som skal ind i tabellen Samlet, skal tjekkes for, om der er valide registreringer af h og v. En del af de ekstra registreringer skyldes, at der ved fejlregistrering (fx ombytning af h og v) er blevet foretaget en ny frem for at rette den tidligere registrering. Derfor skal følgende være opfyldt: 'h>50' og 'v is not null'.
Jeg har selv løst det. Nedenstående udtrækker relevant cpr, dato og tid, som var den problematiske del. Herefter skal det bare sammenkædes med højde og vægt.
create table #reg_temp ( cpr nvarchar(255) not null, dato datetime not null, tid datetime not null )
insert into #reg_temp (cpr, dato, tid) ( select ra.cpr, ra.dato, ra.tid from ( select hb.personnummer as cpr, hb.dato as dato, hb.tid as tid from ( select ha.personnummer, ha.dato, ha.tid from height as ha where h2>50 ) hb inner join ( select va.personnummer, va.dato, va.tid from weight as va where v2 is not null ) vb on hb.personnummer = vb.personnummer and hb.dato = vb.dato and b.tid = vb.tid ) ra right join ( select rb.cpr as cpr, min(rb.dato) as dato from ( select hb.personnummer as cpr, hb.dato as Dato, hb.tid as tid from ( select ha.personnummer, ha.dato, ha.tid from height as ha where h2>50 ) hb inner join ( select va.personnummer, va.dato, va.tid from wight as va where v2 is not null ) vb on hb.personnummer = vb.personnummer and hb.dato = vb.dato and hb.tid = vb.tid ) rb group by rb.cpr ) r on ra.cpr = r.cpr and ra.dato = r.Dato )
create table #reg_temp2 ( cpr nvarchar(255) not null, dato datetime not null, tid datetime not null )
insert into #reg_temp2 (cpr, dato, tid) ( select ra.cpr, ra.dato, ra.tid from ( select cpr, dato, tid from #reg_temp ) ra right join ( select cpr as cpr, max(tid) as tid from #reg_temp group by cpr ) rb on ra.cpr = rb.cpr and ra.tid = rb.tid )
drop table #reg_temp
Synes godt om
Ny brugerNybegynder
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.