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!
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
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?
01. oktober 2002 - 13:30
#2
Jeg skal KUN have de "rækker" der opfylder BEGGE betingelser.
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;
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.
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
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...
01. oktober 2002 - 13:35
#7
proaccess >> Det er en pæn løsning. Den er generisk og skalerbar.
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);
01. oktober 2002 - 13:36
#9
nice answer proaccess, exactly what I would have done
01. oktober 2002 - 13:37
#10
Tak, Lasse ;0)
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!
01. oktober 2002 - 13:37
#12
and: thx, Terry ;0)
01. oktober 2002 - 13:38
#13
SELECT Navn, VB, Engelsk FROM KrydsSkill WHERE VB>3 AND Engelsk>3;
01. oktober 2002 - 13:40
#14
SELECT * FROM table1 where (Skill = 'VB' And Level >= '3') AND (Skill ='Engelsk' And Level >= '3');"
01. oktober 2002 - 13:41
#15
SELECT * FROM table1 where (Skill = 'VB' And Level >=3) AND (Skill ='Engelsk' And Level >=3);" Even...
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 ??
01. oktober 2002 - 13:45
#17
Hehe... Ja den havde jeg sku ikke lige regnet ud :o) -Anders
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!
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!
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...?
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.
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
01. oktober 2002 - 14:06
#23
WHERE 'VB'>=3 AND 'Engelsk'>=3;
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!
01. oktober 2002 - 14:07
#25
proaccess >> ja! alle der ikke opfylder de betingelser optræder bare med User og tomt i resten.. terry >> ??
01. oktober 2002 - 14:07
#26
DAMN TERRY: You were fast on that one...
01. oktober 2002 - 14:08
#27
>kingmanon: Du afgrænser efter et TEKST-felt, men der er tale om talværdier, altså uden ""'er
01. oktober 2002 - 14:08
#28
QRY_Final: SELECT [User], [VB], [Engelsk] FROM QRY_CrossSkill WHERE 'VB'>=3 AND 'Engelsk'>=3;
01. oktober 2002 - 14:10
#29
many years practice :o)
01. oktober 2002 - 14:15
#30
Nu er jeg lost....dammit, det gik lige så godt for mig (eller rettere jer ;))
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;
01. oktober 2002 - 14:21
#32
Thx Terry! - There it is... No ' around fieldnames and no ' around numeral-values
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..
01. oktober 2002 - 14:22
#34
NO VB is now a column name!
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;
01. oktober 2002 - 14:24
#36
VB is a reserved word in Access... hence ( is that the right word for: "derfor"? ) the []'s
01. oktober 2002 - 14:26
#37
We will get there eventually :o)
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!
01. oktober 2002 - 14:28
#39
Then your level is a text field and will be correct!
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';
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??
01. oktober 2002 - 14:33
#42
proaccess, he made the correct solution, it was just the correct "syntax" which was giving problems.
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 !
01. oktober 2002 - 14:36
#44
Jeg kan kun sige MANGE tak til jer begge!
01. oktober 2002 - 14:39
#45
slev tak, to both of you :o)
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser