24. februar 2005 - 12:02Der 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
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;
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;
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.
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;
: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.)
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.
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.
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;
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?
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...
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.
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)
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)
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...
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
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
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.
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
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.