Avatar billede admiralen Nybegynder
19. januar 2007 - 12:43 Der er 25 kommentarer

advanceret select

Hej alle. Jeg står lige overfor en udfordring. Jeg skal hente noget data ud fra en pris/rabat tabel. i tabellen kan kolonnen kontokode antage værdierne 0,1,2. For alle records med værdien 0, skal kolonnen kontorelation være = et debitornummer fra en debitor tabel og kolonnen ecustomer i debitor tabellen skal have værdien 1. Så Kontokode skal altså enten være o,1,2 OG hvis den er 0, skal de førnævnte ting opfyldes.
Derudover er der en varekode i pris/rabat tabellen som ligeledes kan antage værdierne 0,1,2. Her skal det også være sådan så at værdien skal enten være 0,1,2 OG hvis den er 0, så skal varerelation være = et varenummer der findes i tabellen estocktable
Derudover skal dataset kolonnen i prisrabat være = 'dat' og todate kolonnen i pris/rabat tabellen skal være større eller = 01-01-2007 eller have værdien 01-01-1900

mit bud har været
select [kolonner] from prisrabat, estocktable, debkart where((prisrabat.kontokode=0 AND ltrim(prisrabat.kontorelation)=ltrim(debkart.kontonummer) AND debkart.ecustomer=1) OR prisrabat.kontokode=1 OR prisrabat.kontokode=2)AND ((prisrabat.varekode = 0 AND ltrim(prisrabat.varerelation)=ltrim(estocktable.itemnumber)) OR varekode=1 OR varekode=2) AND (tildato>='01-01-2007' OR tildato='01-01-1900') AND dataset='dat'

jeg håber virkelig i kan hjælpe :-)
Avatar billede admiralen Nybegynder
19. januar 2007 - 12:43 #1
det skal lige siges at bud ikke virkede
Avatar billede mbagge Nybegynder
19. januar 2007 - 13:21 #2
Jeg er ikke helt sikker på at jeg forstår 100% hvilke kriterier der helt præcis skal opfyldes (og derfor har jeg ikke forsøgt mig med konkret sql endnu), men som jeg læser det forsøger du følgende:

Hent noget fra nogle joinede tabeller hvor:

[en af følgende skal være opfyldt]
    (kontokode = 1 eller 2) ELLER
    (kontokode = 0 OG ecustormer = 1)

[OG en af følgende skal også være opfyldt]
    (varekode = 1 eller 2) ELLER
    (varekode = 0 OG 'varenummer findes')

[OG ALT følgende skal være opfyld]
    (prisrabat = 'dat') OG
    (todate > noget OG todate < nogetandet)

Svarer dette til hvad du ønker?
Et lille tillæg: Kan varerelation overhovedet være et nummer som ikke findes i estocktable? Hvis ja, ville det så ikke være bedre at checke at det ikke kunne være det? For du bør ikke have relations felter som ikke har en relation...
Avatar billede admiralen Nybegynder
19. januar 2007 - 13:32 #3
det er meget tæt på at være rigtigt forstået. Jeg vil lige gøre opmærksom på at ecustomer er et felt der er i debitor tabellen, og at det felt skal være sat til 1, for den debitor hvis debitor nummer står i feltet kontorelation. Kontorelation er KUN udfyldt med et kundenummer for de records hvor kontokode=0, hvis kontorelation er 1 så står der en rabatgruppe i kontorelation og hvis det er 2, så er kontorelation blankt, da det så er en pris/rabat opsætning der gælder for alle kunder.

mht til varerelationen så kan der sagtens stå et varenummer der ikke findes i estocktable, da estocktable er en tabel der indeholder de vare der er en del af et varekatalog på en webshop. estocktable er således en delmængde af det samlede varesortiment
Avatar billede mbagge Nybegynder
19. januar 2007 - 13:52 #4
hmm.....prøve lige om følgende virker:

select [kolonner] from prisrabat p where kontokode = 0 and (select ecustomer from debkart d where p.kontokode = d.kontokode) = 1

Mht varenummer, ville det så ikke være bedre at have en status i prisrabat der kunne være hhv 0 eller1 alt efter om varen skal med i webshoppen eller ej?
Avatar billede admiralen Nybegynder
19. januar 2007 - 15:28 #5
den returnerede desværre ingenting. Der opstod ingen fejl, men den returnerede desværre ikke nogle records. Jeg har oprettet en enkelt record der skulle leve op til de krav. Jeg omskrev den desuden lidt til:
select * from prisrabat p where kontokode = 0 and (select ecustomer from debkart d where p.kontorelation = d.kontonummer) = 1
da kontode kun er et tal mellem 0 og 3, mens kontorelation er det felt i pris/rabat tabellen der indeholder debitornummeret(men kun hvis kontokode er 0 i samme pris/rabat record)

mht. tabel designet, så er det XAL jeg henter data udfra og datastrukturen ligger fast der. Ved godt man godt kunne ændre det, men det ville kræve man oprettede felterne i pris/rabat tabellen, lavede en kørsel der udfyldte felterne(for det jeg laver er noget der implementeres sammen med kørende systemer), og derudover skulle der også ændres i noget trigger kode.
Avatar billede mbagge Nybegynder
19. januar 2007 - 16:42 #6
hov...det er da også noget vrøvl det jeg skrev før. Test sql'en skal selvfølgelig joine på debitornummeret. Sådan:

select [kolonner] from prisrabat p where kontokode = 0 and (select ecustomer from debkart d where p.kontorelation = d.kontorelation) = 1

Jeg er ikke helt sikker på hvilke felter du har i hvilke tabeller. Kan du skrive en oversigt over de tabeller/kolonner der skal bruges?
Avatar billede admiralen Nybegynder
23. januar 2007 - 11:34 #7
jeg prøvede med
select * from prisrabat p where kontokode = 0 and (select ecustomer from debkart d where p.kontorelation = d.kontonummer) = 1

den fandt desværre ikke noget, men kunne eksekveres uden fejl

de felter jeg skal have ud fra prisrabattabellen er følgende:

                "Dataset"
        "transid"
        "varekode"
        "kontokode"
        "varerelation"
        "kontorelation"
        "mxngdebelxb"
        "fradato"
        "tildato"
        "belxb"
        "procent1"
        "procent2"
        "valuta"
        "relation"
        "leveringstid"
        "prisenhed"
                "sxgvidere"

felter fra andre tabeller skal bruges til afgrænsning er:
itemnumber fra estocktable
kontonummer fra debkart
ecustomer fra debkart
Avatar billede mbagge Nybegynder
23. januar 2007 - 20:17 #8
Og du Har en row i prisrabat hvor kontokode = 0 og det nummer der står i kontorelation også findes i feltet kontonummer i tabellen debkart, hvor der i samme row også står 1 i ecustomer

....hvis altså det gav nogen mening :)
Avatar billede admiralen Nybegynder
24. januar 2007 - 10:01 #9
ja, jeg tror du har fat i den lange ende. HVIS kontokode = 0 i prisrabat tabellen, så betyder det at rabatten gælder for en specifik debitor, og feltet kontorelation i prisrabat tabellen vil derfor være udfyldt med et debitornummer som skal være at finde i tabellen debkart, og jeg er kun interesseret i at få fat i recorden hvis ecustomer = 1 i debkart for det kontonummer

- lige en forklaring for en sikkerheds skyld, men det virker som om du er fint med på hvad det drejer sig om.
Avatar billede mbagge Nybegynder
24. januar 2007 - 10:34 #10
hvad returneres der ved denne sql:

select * from prisrabat p left join debkart d on p.kontorelation = d.kontonummer where kontokode = 0

Og hvis der er resultater af søgningen, har en eller flere af disse så værdien 1 i ecustomer ?
Avatar billede admiralen Nybegynder
24. januar 2007 - 10:43 #11
den returnerer en del rows, men alle felterne der har med debkart at gøre står til NULL
Avatar billede mbagge Nybegynder
24. januar 2007 - 10:46 #12
Er felttyperne for kontorelation og kontokode de samme?
- Gætter på at de begge burde være tal felter..?
Avatar billede admiralen Nybegynder
24. januar 2007 - 11:35 #13
kontokode er integer og kontorelation er varchar10. kontokode kan antage 3 værdier, nemlig 0,1,2 og kontorelation indeholder enten et debitornummer, en debitor rabatgruppe eller blankt, alt efter hvad feltet kontokode indeholder.
Avatar billede mbagge Nybegynder
24. januar 2007 - 12:11 #14
Nu har jeg ikke lige en ms sql ved hånden, så jeg kan ikke lige teste dette. Men jeg gætter på at grunden til at de forskellige sql sætninger ikke returnere rækker, skyldes at felttyperne ikke er ens.
Altså mssql opfatter ikke integer 3 som det samme som varchar 3.
Derfor findes ingen felter hvor kontorelation = kontokode , og derfor får du ingen data ud.
Så første opgave er at ændre felttyper for de kolonner hvor du vil sammenligne om der står samme kunde/vare-nummer.

Når dette er gjort, test så at min sql fra 10.34 idag returnere data - og med ecustomer = 1.
Hvis ja test så efterfølgende sql fra 19/01-2007 13:52:17
Avatar billede admiralen Nybegynder
24. januar 2007 - 12:16 #15
jeg tror du blander tingene lidt sammen....der er ingen steder hvor kontokode skal være = kontorelation. Kontorelation antager en værdi AFHÆNGIG af hvad kontokode viser, men skal på intet tidspunkt sammenlignes med denne. kontorelation skal derimod sammenlignes med debitornummeret fra debkart i de tilfælde hvor kontokode = 0. Og derudover skal ecustomer i debkart også være 1.
Avatar billede mbagge Nybegynder
24. januar 2007 - 12:21 #16
min fejl,,, :)

Så prøver vi istedet disse sql:

1)
select * from prisrabat p left join debkart d on p.kontorelation = d.debitornummer where kontokode = 0

2)
select * from prisrabat p where kontokode = 0 and (select ecustomer from debkart d where p.kontorelation = d.debitornummer) = 1
Avatar billede admiralen Nybegynder
24. januar 2007 - 12:57 #17
1) returnerer records, men alle værdierne debkart felterne som vises i forespørgslen står til NULL

2) returnerer ingen records
Avatar billede mbagge Nybegynder
24. januar 2007 - 13:23 #18
Er felterne kontorelation og debitornummer begge af typen varchar?
Avatar billede admiralen Nybegynder
24. januar 2007 - 13:42 #19
jeps :-)
Avatar billede mbagge Nybegynder
24. januar 2007 - 13:54 #20
Det giver ikke rigtig nogen mening.

Det virker lidt som om du får returneret alle rows fra prisrabat hvor kontokode = 0, men at alle debkart felter står til null fordi der ikke findes nogle entries som hvor kontorelation = debitornummer.

Er du sikker på at der er et eller flere tilfælde hvor samme debitornummer står i begge tabeller OG kontokode ved en eller flere af disse = 0?
Avatar billede admiralen Nybegynder
24. januar 2007 - 14:16 #21
jeg er 100% sikker på jeg har oprettet en debitor hvor ecustomer = 1 OG at jeg har oprettet en rabat  record for denne debitor i prisrabat, hvor kontokode = 0

det er ldit mystisk, har også selv prøvet med:

SELECT * FROM prisrabat
WHERE kontokode=0 AND
kontorelation IN(SELECT kontonummer FROM debkart WHERE ecustomer=1)

men uden held, stadig ingen record fundet :-(
Avatar billede admiralen Nybegynder
24. januar 2007 - 14:21 #22
SELECT * FROM debkart WHERE ecustomer=1

returnerer 1 record

og

SELECT * FROM prisrabat
WHERE kontokode=0

returnerer en hel masse records hvor man iøvrigt kan se debitorens kontonummer fra query 1 står i kontorelation feltet på 1 af recordsne
Avatar billede admiralen Nybegynder
24. januar 2007 - 14:31 #23
nvm...jeg har løst det. Jeg fik vist lige glemt at XALeren højrestiller, så jeg lavede lige en ltrim så virkede det :-)
Avatar billede mbagge Nybegynder
24. januar 2007 - 14:44 #24
Så nu virker det hele, eller div test-sql's virker?
Avatar billede admiralen Nybegynder
24. januar 2007 - 15:20 #25
jeps, det ser fint ud nu :-)
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