Avatar billede kingmanon Nybegynder
01. oktober 2002 - 13:19 Der er 43 kommentarer og
2 løsninger

2 udtræk fra samme tabel (with a twist)

Så har jeg sørme brug for hjælp igen :\

Jeg sidder og er ved at lave en skill matrix hvor man selvfølgelig skal kunne søge, og finde en "best fit" ud fra X antal betingelser.

Der hvor jeg er rendt hovedet imod muren er når jeg skal have trukket flere records ud fra en tabel med forskellige betingelser. Svært at forklare ja!

Lad os sige DB'en ser sådan her ud:

NAVN SKILL LEVEL
JJ VB 4
JJ C++ 3
JJ Engelsk 4
BJ VB 5
BJ Engelsk 3
BJ C++ 2

Nu skal jeg så finde alle de medarbejdere der eksempelvis har >= 3 i VB og >= 3 i engelsk.

en simpel "SELECT * FROM table1 where ('VB' >= '3') AND ('Engelsk' >= '3');" vil jo ikke virke da der ikke er EN record der opfylder dette krav.

Hvad gør man så?
Håber det er godt nok beskrevet, ellers spørg gerne!
Avatar billede lasse_buck Nybegynder
01. oktober 2002 - 13:27 #1
SELECT * FROM table1 where ('VB' >= '3') OR ('Engelsk' >= '3');
Giver dig de rækker du gerne vil have, men du vil have rækker, som opfylder begge betingelser til at stå først?
Avatar billede kingmanon Nybegynder
01. oktober 2002 - 13:30 #2
Jeg skal KUN have de "rækker" der opfylder BEGGE betingelser.
Avatar billede proaccess Nybegynder
01. oktober 2002 - 13:30 #3
KRYDS-TABULERING...!

Du laver en forespørgsel, som du kalder KrydsSkill:

TRANSFORM Max(TabelSkill.Level) AS MaksOfLevel
SELECT TabelSkill.Navn
FROM TabelSkill
GROUP BY TabelSkill.Navn
PIVOT TabelSkill.Skill;

Derefter kan du bruge denne forespørgsel, som grundlag for fremtidige forespørgsler...

SELECT * FROM KrydsSkill WHERE VB>=3 AND Engelsk>=3;
Avatar billede lasse_buck Nybegynder
01. oktober 2002 - 13:30 #4
Undskyld, jeg lagde ikke mærke til, at du havde samme navn flere gange i din tabel.

Du skal bruge en inner join på tabellen selv.
Avatar billede kingmanon Nybegynder
01. oktober 2002 - 13:31 #5
Output fra en evt. fremtidig SQL streg ville derved give:

JJ VB 4
JJ Engelsk 4
BJ VB 5
BJ Engelsk 3
Avatar billede proaccess Nybegynder
01. oktober 2002 - 13:33 #6
NOPE... Hvis din kommentar var til mig...

KrydsSkill vil have formatet:
NAVN  VB  C++  ENGELSK
JJ    4    3    3
BJ    5    3    2

Hvor du så kan vælge kolonner, som du vil...
Avatar billede lasse_buck Nybegynder
01. oktober 2002 - 13:35 #7
proaccess >> Det er en pæn løsning. Den er generisk og skalerbar.
Avatar billede proaccess Nybegynder
01. oktober 2002 - 13:36 #8
Du kan også vælge at gå sub-select-vejen...

SELECT Navn
FROM TabelSkill
WHERE Navn IN (SELECT Navn FROM TabelSkill WHERE VB>=3)
  AND Navn IN (SELECT Navn FROM TabelSkill WHERE Engelsk>=3);
Avatar billede terry Ekspert
01. oktober 2002 - 13:36 #9
nice answer proaccess, exactly what  I would have done
Avatar billede proaccess Nybegynder
01. oktober 2002 - 13:37 #10
Tak, Lasse  ;0)
Avatar billede kingmanon Nybegynder
01. oktober 2002 - 13:37 #11
Jeg syntes også umiddelbart den er flot, MEN hvis jeg ikke vil have skills med som der ikke bliver spurgt på (som her C++) hvad gør jeg så?

/me som er helt rundt på gulvet over hvor dygtige folk er!
Avatar billede proaccess Nybegynder
01. oktober 2002 - 13:37 #12
and: thx, Terry  ;0)
Avatar billede proaccess Nybegynder
01. oktober 2002 - 13:38 #13
SELECT Navn, VB, Engelsk FROM KrydsSkill WHERE VB>3 AND Engelsk>3;
Avatar billede a-torsten Nybegynder
01. oktober 2002 - 13:40 #14
SELECT * FROM table1 where (Skill = 'VB' And Level >= '3') AND (Skill ='Engelsk' And Level >= '3');"
Avatar billede a-torsten Nybegynder
01. oktober 2002 - 13:41 #15
SELECT * FROM table1 where (Skill = 'VB' And Level >=3) AND (Skill ='Engelsk' And Level >=3);"

Even...
Avatar billede proaccess Nybegynder
01. oktober 2002 - 13:43 #16
Hey a-torsten...  Hvor ser du een række i table1, som BÅDE har en VB- og en Engelsk-skill ??
Avatar billede a-torsten Nybegynder
01. oktober 2002 - 13:45 #17
Hehe... Ja den havde jeg sku ikke lige regnet ud :o)

-Anders
Avatar billede kingmanon Nybegynder
01. oktober 2002 - 13:46 #18
proaccess >> Efter at have prøvet din super løsning ser det ud til at jeg også får brugere ud der ikke opfylder betingelserne, deres skills er bare tomme...

eksempel på output:
NAVN  VB  ENGELSK
JJ    4    3
BJ    5    2
KH

Hvor KH hverken har VB eller Engelsk..måske "my bad" at jeg ikke har fortalt at de findes!
Avatar billede proaccess Nybegynder
01. oktober 2002 - 13:49 #19
Burde ikke kunne forekomme, men foretag en lille ændring i fin KrydsSkill-forespørgsel...

TRANSFORM Max(Nz(TabelSkill.Level, 0)) AS MaksOfLevel
SELECT TabelSkill.Navn
FROM TabelSkill
GROUP BY TabelSkill.Navn
PIVOT TabelSkill.Skill;

Så bliver alle Null-værdier lavet om til tallet 0, som jo er mindre end 3!
Avatar billede proaccess Nybegynder
01. oktober 2002 - 13:57 #20
>kingmanon: Jeg kan ikke fremprovokere "tomme" navne, som kommer med... har du en ydre forespørgsel med LEFT JOIN med i dette...?
Avatar billede kingmanon Nybegynder
01. oktober 2002 - 14:04 #21
proaccess >> Nope, har kun det du har skrevet til mig...

QRY_CrossSkill:
TRANSFORM Max(Nz([TBL_Main].[Level],0)) AS MaksOfLevel
SELECT [TBL_Main].[User]
FROM TBL_Main
GROUP BY [TBL_Main].[User]
PIVOT [TBL_Main].[Skill];

QRY_Final:
SELECT [User], [VB], [Engelsk]
FROM QRY_CrossSkill
WHERE 'VB'>='3' AND 'Engelsk'>='3';

Vær opmærksom på at jeg nu har de rigtige feltnavne på, navn = user osv.
Avatar billede proaccess Nybegynder
01. oktober 2002 - 14:05 #22
Og QRY_Final har så tomme navne med? 

Altså dit output fra før:
NAVN  VB  ENGELSK
JJ    4    3
BJ    5    2
KH
Avatar billede terry Ekspert
01. oktober 2002 - 14:06 #23
WHERE 'VB'>=3 AND 'Engelsk'>=3;
Avatar billede proaccess Nybegynder
01. oktober 2002 - 14:06 #24
QRY_CrossSkill har jo ALLE navne med uden hensyntagen til opnået LEVEL...

QRY_Final skal afgrænse dit udtræk!
Avatar billede kingmanon Nybegynder
01. oktober 2002 - 14:07 #25
proaccess >> ja!
alle der ikke opfylder de betingelser optræder bare med User og tomt i resten..

terry >> ??
Avatar billede proaccess Nybegynder
01. oktober 2002 - 14:07 #26
DAMN TERRY: You were fast on that one...
Avatar billede proaccess Nybegynder
01. oktober 2002 - 14:08 #27
>kingmanon: Du afgrænser efter et TEKST-felt, men der er tale om talværdier, altså uden ""'er
Avatar billede proaccess Nybegynder
01. oktober 2002 - 14:08 #28
QRY_Final:
SELECT [User], [VB], [Engelsk]
FROM QRY_CrossSkill
WHERE 'VB'>=3 AND 'Engelsk'>=3;
Avatar billede terry Ekspert
01. oktober 2002 - 14:10 #29
many years practice :o)
Avatar billede kingmanon Nybegynder
01. oktober 2002 - 14:15 #30
Nu er jeg lost....dammit, det gik lige så godt for mig (eller rettere jer ;))
Avatar billede terry Ekspert
01. oktober 2002 - 14:18 #31
QRY_CrossSkill:
TRANSFORM Max(Nz([TBL_Main].[Level],0)) AS MaksOfLevel
SELECT [TBL_Main].[User]
FROM TBL_Main
GROUP BY [TBL_Main].[User]
PIVOT [TBL_Main].[Skill];

QRY_Final:
SELECT [User], [VB], [Engelsk]
FROM QRY_CrossSkill
WHERE VB>=3 AND Engelsk>=3;
Avatar billede proaccess Nybegynder
01. oktober 2002 - 14:21 #32
Thx Terry! - There it is...  No ' around fieldnames and no ' around numeral-values
Avatar billede kingmanon Nybegynder
01. oktober 2002 - 14:21 #33
terry >> VB og Engelsk skal vel stadig være i '?

Men jeg får en "Data type mismatch" hvis ikke Skill har '.

Skill er selv. Text og Level er Number..
Avatar billede terry Ekspert
01. oktober 2002 - 14:22 #34
NO VB is now a column name!
Avatar billede proaccess Nybegynder
01. oktober 2002 - 14:23 #35
QRY_CrossSkill:
TRANSFORM Max(Nz([TBL_Main].[Level],0)) AS MaksOfLevel
SELECT [TBL_Main].[User]
FROM TBL_Main
GROUP BY [TBL_Main].[User]
PIVOT [TBL_Main].[Skill];

QRY_Final:
SELECT [User], [VB], [Engelsk]
FROM QRY_CrossSkill
WHERE [VB]>=3 AND [Engelsk]>=3;
Avatar billede proaccess Nybegynder
01. oktober 2002 - 14:24 #36
VB is a reserved word in Access... hence ( is that the right word for: "derfor"? ) the []'s
Avatar billede terry Ekspert
01. oktober 2002 - 14:26 #37
We will get there eventually :o)
Avatar billede kingmanon Nybegynder
01. oktober 2002 - 14:26 #38
Ok, forvirringen er total =)

QRY_Final:
SELECT [User], [VB], [Engelsk]
FROM QRY_CrossSkill
WHERE [VB]>=3 AND [Engelsk]>=3;

Giver "Mismatch" problemer, men

QRY_Final:
SELECT [User], [VB], [Engelsk]
FROM QRY_CrossSkill
WHERE [VB]>='3' AND [Engelsk]>='3';

Giver det korrekte!!

Hope you follow Terry!
Avatar billede terry Ekspert
01. oktober 2002 - 14:28 #39
Then your level is a text field and will be correct!
Avatar billede terry Ekspert
01. oktober 2002 - 14:29 #40
If LEVEL was a numeric field then you would use
WHERE [VB]>=3 AND [Engelsk]>=3;
if it is a text field then you would use
WHERE [VB]>='3' AND [Engelsk]>='3';
Avatar billede kingmanon Nybegynder
01. oktober 2002 - 14:30 #41
It HAS been a text field, but I changed it to a numeric field and reentered the data..maybe I screwed it up :-O

But you guys, who should get the points??
Avatar billede terry Ekspert
01. oktober 2002 - 14:33 #42
proaccess, he made the correct solution, it was just the correct "syntax" which was giving problems.
Avatar billede proaccess Nybegynder
01. oktober 2002 - 14:34 #43
Jeg ville gerne have alle pointene, ud fra betragtningen af at dette spørgsmål IKKE omhandlede hvilken datatype, felterne udgjorde... Men derimod hvordan du fik fat i dem...  MEN igen, uden Terry's hjælp var vi nok ikke blevet enige om løsningen...  Så en 20 pts. til Terry er da OK !
Avatar billede kingmanon Nybegynder
01. oktober 2002 - 14:36 #44
Jeg kan kun sige MANGE tak til jer begge!
Avatar billede terry Ekspert
01. oktober 2002 - 14:39 #45
slev tak, to both of you :o)
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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