Avatar billede 2dbornot2db Nybegynder
24. februar 2005 - 12:02 Der er 36 kommentarer og
3 løsninger

SQL-streng

Jeg har en milepælskalendertabel for en række projekter, hvor man kan vælge en status fra en relateret tabel. Status er nummereret og har også en tekstbeskrivelse.

Jeg vil gerne i en query se tekstbeskrivelsen for den maksimale status for alle projekter, men uden at man skal kunne se statusnummeret. Jeg har lavet følgende (forsimplede) query:

SELECT tblProjektKalender.fldRunID, Max([tblProjekComList].[fldSortering] & " - " & [tblProjektComList].[fldTekstUK]) AS Status
FROM tblProjektComList RIGHT JOIN tblProjektKalender ON tblProjektComList.fldProjektComListID = tblProjektKalender.fldProjektComListID
GROUP BY tblProjektKalender.fldRunID

[fldSortering] er statusnummeret.

Hvis spørgsmålet giver mening vil jeg sætte pris på et forslag til hvordan problemet kan løses
Avatar billede terry Ekspert
24. februar 2005 - 13:21 #1
If I understand your question correctly then try this

SELECT tblProjektKalender.fldRunID, (SELECT TOP 1 [tblProjekComList].[fldSortering] & " - " & [tblProjekComList].[fldTekstUK] AS status
FROM tblProjekComList
WHERE tblProjekComList.fldProjektComListID  = tblProjektKalender.fldProjektComListID
ORDER BY tblProjekComList.fldSortering DESC) AS Status
FROM tblProjektKalender;
Avatar billede terry Ekspert
24. februar 2005 - 13:23 #2
almost the same

SELECT tblProjektKalender.fldRunID, (SELECT TOP 1 [tblProjekComList].[fldSortering] & " - " & [tblProjekComList].[fldTekstUK]
FROM tblProjekComList
WHERE tblProjekComList.fldProjektComListID  = tblProjektKalender.fldProjektComListID
ORDER BY tblProjekComList.fldSortering DESC) AS Status
FROM tblProjektKalender;
Avatar billede 2dbornot2db Nybegynder
24. februar 2005 - 13:38 #3
Nej, jeg har nok formuleret mig lidt kludret.

Jeg vil gerne have [tblProjektComList].[fldTekstUK] for hver [tblProjektKalender].[fldRunID], men kun for den maksimale [tblProjektComList].[fldSortering]. Sådan ser det ud nu:

RunID      Status
1          7 - Accepted
2          4 - Under review
3          5 - Returned with comments

Jeg vil gerne have:

RunID      Status
1          Accepted
2          Under review
3          Returned with comments

Hver RunID (projekt) gennemløber alle status fra 1-8 (med tilhørende fldTekstUK) og jeg skal bruge den største status.
Jeg håber det gav bedre mening.
Avatar billede 2dbornot2db Nybegynder
24. februar 2005 - 13:42 #4
Jeg har prøvet Right(Max([fldSortering] & " " & [fldTekstUK]),Len(Max([fldSortering] & " " & [fldTekstUK]))-4) AS Status

Det virker fint, men jeg får et problem hvis der pludselig kommer 2-cifrede fldSortering.
Avatar billede terry Ekspert
24. februar 2005 - 13:56 #5
I am not 100% sure what you want

If the first example is the result from th eSQL I gave
RunID      Status
1          7 - Accepted
2          4 - Under review
3          5 - Returned with comments

then try this
SELECT tblProjektKalender.fldRunID, (SELECT TOP 1 [tblProjekComList].[fldTekstUK]
FROM tblProjekComList
WHERE tblProjekComList.fldProjektComListID  = tblProjektKalender.fldProjektComListID
ORDER BY tblProjekComList.fldSortering DESC) AS Status
FROM tblProjektKalender;
Avatar billede terry Ekspert
24. februar 2005 - 13:57 #6
No need to rejecy answers until we are finished :o)
Avatar billede 2dbornot2db Nybegynder
24. februar 2005 - 14:01 #7
:O)
fldSortering tjener alene til at kunne hjælpe brugeren til at finde ud af i hvilken rækkefølge de forskellige status skal tildeles (først gives 1, så 2 og så fremdeles.)
Avatar billede terry Ekspert
24. februar 2005 - 14:05 #8
does the last SQL work?
Avatar billede 2dbornot2db Nybegynder
24. februar 2005 - 14:07 #9
Det første resultat er fra min egen query, som virker fint.
Jeg bliver nødt til at bruges "max"-metoden for at finde det højeste fldSortering. Jeg skal bare ikke bruge fldSortering, men det tilsvarende fldTekstUK.
Avatar billede 2dbornot2db Nybegynder
24. februar 2005 - 14:09 #10
Nej den sidste fungerer ikke. Den tager ikke højde for RunID så alle får bare den samme status (svarende til den højest mulige)
Avatar billede terry Ekspert
24. februar 2005 - 14:09 #11
have you tried the last I gave?
Avatar billede 2dbornot2db Nybegynder
24. februar 2005 - 14:13 #12
Jeg tror jeg gør således:

SELECT tblProjektKalender.fldRunID, Max([tblProjekComList].[fldSortering]) AS Status
FROM tblProjektComList RIGHT JOIN tblProjektKalender ON tblProjektComList.fldProjektComListID = tblProjektKalender.fldProjektComListID
GROUP BY tblProjektKalender.fldRunID

Og efterfølgende laver jeg en ny query hvor jeg joiner ovenstående med tblProjektComList på Status = [tblProjekComList].[fldSortering] og tager [tblProjekComList].[fldTekstUK] fra den 'nye' tblProjekComList.

Lidt kluntet måske...
Avatar billede terry Ekspert
24. februar 2005 - 14:15 #13
can you give an example of fields/data for BOTH tables and also which fields are related.
Avatar billede proaccess Nybegynder
24. februar 2005 - 14:21 #14
Du skal prøve at ændre din Status-funktion til:

Mid(Max(Right("000" & [fldSortering],3) & [fldTekstUK]),4) AS Status
Avatar billede terry Ekspert
24. februar 2005 - 14:23 #15
the SQL you originally gave doesnt work! Ther is an error in one of the table names
tblProjekComList (no t)!
If I alter it to tblProjektComList
then this SQL works with the data I have entered

SELECT tblProjektKalender.fldRunID, (SELECT TOP 1 [tblProjektComList].[fldTekstUK]
FROM tblProjektComList
WHERE tblProjektComList.fldProjektComListID  = tblProjektKalender.fldProjektComListID
ORDER BY tblProjektComList.fldSortering DESC) AS Status
FROM tblProjektKalender;

But of course my data may not be correct
Avatar billede terry Ekspert
24. februar 2005 - 14:31 #16
hi proaccess, didnt see you there :o) hows things?
Avatar billede proaccess Nybegynder
24. februar 2005 - 14:34 #17
>Terry: It's going fine! - Lots of work, just came by to check on some html-programming...
Thomas and you are still going strong, I see!
Avatar billede terry Ekspert
24. februar 2005 - 14:42 #18
I'm not too active on eksperten any more, far too much work on. So I expect Thomas to zoom past very soon.

Concerning this SQL question. I dont see why TOP 1 shouldnt do the trick. Is it not the text with the heighest fldSortering that we are looking for?
Avatar billede terry Ekspert
24. februar 2005 - 14:44 #19
24/02-2005 13:38:40 " .... men kun for den maksimale [tblProjektComList].[fldSortering]."!
Avatar billede 2dbornot2db Nybegynder
24. februar 2005 - 14:46 #20
Terry -> Ja, jeg havde selv set fejlen med 't'. Beklager :-(
Jeg kan ikke få sætningen til at virke og sidder og prøver at mingelere den til.

Proaccess -> Det ser fint ud med dit forslag. Jeg er bare ikke sikker på at jeg forstår mekanikken. Er det en metode til at sikre sig imod 2-cifrede fldSortering?
Avatar billede proaccess Nybegynder
24. februar 2005 - 14:46 #21
It was only in regards to the coment of 13:42:32, where 2dbornot2db mentioned problems with status above 10, and his formula converted the number to test where 11 comes before 2, my solution adds 0's before the number, and because of that, he will get the right text...  without any subqueries...
Avatar billede 2dbornot2db Nybegynder
24. februar 2005 - 14:50 #22
Proaccess -> Det er rigtig. Den problematik er der også. Min primære bekymring var nu, at Right-fuktionen skulle barbere det korrekte antal karakterer af.

Terry -> "Is it not the text with the heighest fldSortering that we are looking for?" Jo, præcis.
Avatar billede terry Ekspert
24. februar 2005 - 14:51 #23
above 9 :o)

without sub queries but with LOTS of Mids and Max and JOINs
Avatar billede proaccess Nybegynder
24. februar 2005 - 14:52 #24
Din right-bekymring er også væk...!

Ved at "opgradere" dit status-tal til ALTID at være på 3 cifre (fx. 011), så ved du automatisk at den skal tage fra 4. tegn...
(Som min funktion gær det, ved at bruge MID)
Avatar billede terry Ekspert
24. februar 2005 - 14:52 #25
Terry -> "Is it not the text with the heighest fldSortering that we are looking for?" Jo, præcis.

then I am sure the SQL I gave should work
Avatar billede terry Ekspert
24. februar 2005 - 14:53 #26
proaccess your the SQL expert. Should the SQL I gave work?
Avatar billede proaccess Nybegynder
24. februar 2005 - 14:59 #27
:)  Thx. You dont have 2 flater? me...

I havn't looked into the SQL's, only the Status-part.
So I can't shoot down your SQL!

I would have guessed:
SELECT tblProjektKalender.fldRunID, Mid(Max(Right("000" & tblProjektComList.fldSortering,3) & tblProjektComList.fldTekstUK),4) AS Status
FROM tblProjektComList INNER JOIN tblProjektKalender ON tblProjektComList.fldProjektComListID = tblProjektKalender.fldProjektComListID
GROUP BY tblProjektKalender.fldRunID

WITHOUT ANY SUB-QUERIES - AND ONLY 1 MAX ON A NORMAL GROUP-BY...    ;0)
Avatar billede proaccess Nybegynder
24. februar 2005 - 15:01 #28
NOTE: I also converted the RIGHT JOIN to an INNER JOIN, as it doesn't make sense to group by on the possible not-existing data...  tblProjectKalender.fldRunID is used, and we have to have either an INNER og LEFT join...
Avatar billede terry Ekspert
24. februar 2005 - 15:03 #29
I agree on the RIGHT to INNER join
Avatar billede proaccess Nybegynder
24. februar 2005 - 15:04 #30
MY MISTAKE: The RIGHT JOIN was correct... The order of the tables was the other way around in my world...
Avatar billede terry Ekspert
24. februar 2005 - 15:05 #31
I still prefer my SQL, if it works whcih I am resonably sure does :o)
Avatar billede 2dbornot2db Nybegynder
24. februar 2005 - 15:07 #32
Det gør den umiddelbart også.
Jeg har i min formulering af spørgsmålet prøvet at reducere til det væsentlige, men har åbenbart ikke fået det hele med:
Jeg fik en fejl fordi jeg efterfølgende prøvede at gruppere på udtrykket (i query-builderen). Jeg skal nemlig også have max(fldDato) fra tblProjektKalender ellers får jeg blot alle status for alle projekter.

Det er ikke dit problem :-) Jeg siger tak for hjælpen. Også til Proaccess
Avatar billede terry Ekspert
24. februar 2005 - 15:11 #33
selv tak
Avatar billede 2dbornot2db Nybegynder
24. februar 2005 - 15:19 #34
Et hurtigt tillægsspørgsmål hvis du har tid:
Kan jeg indsætte en GROUP BY i sub-query'en? Nedenstående virker ikke rigtig

SELECT tblProjektKalender.fldRunID, (SELECT TOP 1 [tblProjektComList].[fldTekstUK]
FROM tblProjektComList
WHERE tblProjektComList.fldProjektComListID  = tblProjektKalender.fldProjektComListID
GROUP BY [tblProjektComList].[fldTekstUK]             
ORDER BY tblProjektComList.fldSortering DESC) AS Status
FROM tblProjektKalender
GROUP BY tblProjektKalender.fldRunID
Avatar billede terry Ekspert
24. februar 2005 - 15:26 #35
Why do you need a group by, you are only selecting 1 record?

Is it possible for you to send me your dB, its MUCH easier seeing some data?

eksperten@NOSPAMsanthell.dk
remove NOSPAM
Avatar billede 2dbornot2db Nybegynder
24. februar 2005 - 15:46 #36
Nej desværre ikke. Som jeg nævnte fik jeg i mit forsøg på at reducere problemet til det væsentlige, reduceret lige lovlig meget. Jeg skal også bruge max(fldDato) fra tblProjektKalender og det kræver at jeg grupperer:

SELECT tblProjektKalender.fldRunID, max(tblProjektKalender.fldDato) as MaxDato, (SELECT TOP 1 [tblProjektComList].[fldTekstUK]
FROM tblProjektComList
WHERE tblProjektComList.fldProjektComListID  = tblProjektKalender.fldProjektComListID
GROUP BY [tblProjektComList].[fldTekstUK]             
ORDER BY tblProjektComList.fldSortering DESC) AS Status
FROM tblProjektKalender
GROUP BY tblProjektKalender.fldRunID

Jeg ville hellere end gerne sende dig db'en, men for det første er det "...against company policy...", for det andet ligger alle data på en SQL-server.
Avatar billede terry Ekspert
24. februar 2005 - 16:04 #37
You should be able to use GROUP BY in the sub select but I dont really understand why it is necessary.
But then without all of the details it isnt always easy to understand
Avatar billede 2dbornot2db Nybegynder
24. februar 2005 - 16:12 #38
Trust me, it's necessary :-)

Jeg må læse lidt på syntaksen i sub-queries. Du skal have tusind tak for al hjælpen.
Avatar billede terry Ekspert
24. februar 2005 - 16:22 #39
hope you get it working.

mvh
Terry
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