Avatar billede cutehobbes Nybegynder
14. oktober 2008 - 19:55 Der er 9 kommentarer og
1 løsning

Sammenkædning af to tabeller m.m.

Hej.. jeg har brug for lidt hjælp :-D

Jeg har 2 databaser 1=core_absence og core_user og jeg skal bruge noget fra dem begge.
Fra core_absence skal jeg bruge createdby, absencetype, start og stopdato
Fra core_user skal jeg bruge det arbnr fra den bruger som svarer til createdby.
Således at output er createdby, absencetype, startdate, stopdate, arbnr

Jeg går udfra jeg skal finde det der er ens i tabellerne så de kan kædes sammen?

Derudover skal jeg, hvis det er muligt have en udregning med stopdate minus startdate (dette kan evt. senere klares i Excel) og så skal jeg kunne sige jeg kun vil se resultater fra til og med en given periode...

Jeg ved det er meget, måske :-D
Men skriv gerne hvis I skal bruge flere oplysninger - jeg prøver i mellemtiden at finde det felt der ens i begge tabeller
Avatar billede cutehobbes Nybegynder
14. oktober 2008 - 20:13 #1
Jeg har prøvet dette:
SELECT core_user.username, core_user.5E0B2F9D_A66C_4B98_BE74_91E808BA1BE7, core_absence.createdby, core_absence.absencetype,
core_absence.startdate, core_absence.stopdate
FROM core_absence, core_user
where
core_absence.createdby = core_user.username

Fejl:
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near '.5E0'.

Men feltet hedder altså det der monster lange noget...
Avatar billede cutehobbes Nybegynder
14. oktober 2008 - 20:44 #2
Denne virker:
SELECT core_user.username, core_absence.absencetype,core_absence.startdate, core_absence.stopdate
FROM core_absence, core_user
where
core_absence.createdby = core_user.username

Men så mangler jeg at sammenkoble username med et arbnr... :(
Avatar billede cutehobbes Nybegynder
14. oktober 2008 - 21:12 #3
Hej igen - jeg har nu fået næsten det hele til at virke... får jeg kun vist resultater fra f.eks. oktober 2008 når hhv start/stop dato format = 20081014000000
(Aner ikke hvad nullerne præsenter) :)
Avatar billede cutehobbes Nybegynder
14. oktober 2008 - 21:27 #4
Jeg lukker her... jeg ved ikke hvordan man skal kunne regne antal dage ud udfra de start og stopdatoer - men måske nogen EXCEL hajer på arbejde kan..
Avatar billede hrc Mester
14. oktober 2008 - 21:40 #5
I din løsning bør du rette det til joins. Det er mere "moderne" og giver dig flere muligheder for at fifle med data. Desuden er syntaksen pænere.

select cu.username, ca.absencetype, ca.startdate, ca.stopdate
  from core_absence ca
  join core_user cu on (cu.createdby = cu.username)

Mht. at regne datoer ud så kan du bruge datediff-funktionen. Hvis du støder på null-værdier kan du fange dem med coalesc og derved sætte en slutdato - hvis altså det er nødvendigt.

I øvrigt er nullerne garanteret time minut, sekund.
Avatar billede hrc Mester
14. oktober 2008 - 21:41 #6
Hvis du har mulighed for at påvirke databasens opbygning bør du give felterne nogle ordentlige navne. Feltet CreatedBy leder tankerne i retning af et datofelt, ikke en fremmednøgle.
Avatar billede cutehobbes Nybegynder
15. oktober 2008 - 09:06 #7
Hej hrc - ok.. ja kan godt se det er noget pænere :-D
Jeg prøver med datediff.. desværre har jeg ingen mulighed for at påvirke opbygningen :-/ Jeg åbner et nyt spørgsmål, så du kan få point for du har jo sådan set svaret på mit spørgsmål... Hvordan ved du så lige at jeg opretter et nyt kun til dig? :-D
Avatar billede hrc Mester
15. oktober 2008 - 09:49 #8
Man plejer at skrive "Points til <navn>"

Følgende script returnerer summen af dage indenfor en given periode for boligerne i et givet boligkompleks. Alle "case"-erne er fordi jeg tilretter datoerne så de starter og slutter indenfor det interval jeg har bestemt; aldrig ældre eller nyere.

Parametrene ":fra_dato1" og lignende er fordi eksemplet er kopieret fra et Delphi-projekt.

select k.ref, k.navn as kompleks_navn,
      sum(datediff(day, case
                          when h.fra_dato < :fra_dato1 then :fra_dato2
                          else h.fra_dato
                        end,
                        case
                          when h.til_dato > :til_dato1 then :til_dato2
                          when h.til_dato is null then :til_dato3
                          else h.til_dato
                        end)) as brutto
from bolig b
join historik h on (h.bolig_ref = b.ref)
join kompleks k on (k.ref = b.kompleks_ref)
join boligattributrel bar on (bar.bolig_ref = b.ref)
join attribut a on (a.ref = bar.attribut_ref)
where (h.konstant = :konstant)
  and (bar.attribut_ref = :attribut_ref)
  ...
group by k.ref, k.navn
order by k.navn

Jeg bruger den grundlæggende join, men der er andre, inner, outer, left og right joins som man kan bruge, se: http://www.w3schools.com/sql/

Jeg er i øvrigt ganske sikker på at nogle af hajerne sagtens kunne lave det pænere (og de må da gerne kommentere ;-))
Avatar billede cutehobbes Nybegynder
15. oktober 2008 - 10:33 #9
Sikke du blir ved :-D Det er helt kanon... jeg ser om jeg kan gennemskue det i mit eget... men læg et svar på http://www.eksperten.dk/spm/849071
Tak for dine input og fortsat god dag.
Avatar billede hrc Mester
15. oktober 2008 - 13:40 #10
Jep. Jeg gør i konstruktiv spam!
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