Avatar billede zyfer Nybegynder
12. marts 2010 - 09:14 Der er 11 kommentarer og
1 løsning

Hjælp.. SQL Udvælgelse...

Hej..

Har en SQL udvælgelse jeg ikke kan få til og fungere..(MS-SQL-VB.NET)
-----------------------------------
DATA :

ProjID - Changeddate - StatusID
1 12/3/2010 2
1 13/3/2010 6
1 15/3/2010 5
2 10/2/2010 2
2 13/2/2010 6
3 08/2/2010 5
3 10/2/2010 6

RESULTAT :

ProjID - Changeddate - StatusID
2 13/2/2010 6
3 10/2/2010 6
------------------------------------

Jeg skal bruge de poster hvor den sidste registrering(Changeddate) er StatusID=6

Jeg har følgende SQL :

SELECT G_PROJ.PROJID, G_PROJ.PLANNEDENDDATE, G_PROJ.TASK_NAME, G_PROJ.DESCR, G_PROJSTATUS.STATUSID,G_PROJSTATUS.CHANGEDDATE AS DATE

FROM G_PROJ INNER JOIN G_PROJSTATUS ON G_PROJ.PROJID = G_PROJSTATUS.FK_PROJECT

WHERE (G_PROJSTATUS.CHANGEDDATE IN
(SELECT MAX(G_PROJSTATUS_1.CHANGEDDATE) AS DATE
FROM G_PROJ AS G_PROJ_1 INNER JOIN
G_PROJSTATUS AS G_PROJSTATUS_1 ON G_PROJ_1.PROJID = G_PROJSTATUS_1.FK_PROJECT
GROUP BY G_PROJ_1.PROJID))

GROUP BY G_PROJ.PLANNEDENDDATE, G_PROJ.TASK_NAME, G_PROJ.DESCR, G_PROJSTATUS.STATUSID, G_PROJSTATUS.CHANGEDDATE, G_PROJ.PROJID

HAVING (G_PROJSTATUS.STATUSID = 6)

ORDER BY G_PROJ.PROJID DESC

Dette virker dog ikke, da den medtager alle poster med StatusID=6, også selv om det ikke r den sidste dato (Changeddate)..

Håber nogen kan hjælpe:: :-)
Avatar billede Syska Mester
12. marts 2010 - 09:29 #1
Skal du ikke bare joine de 2 tables ... og så:

WHERE statusid = 6 ?

Jeg kan ikke lige genneskue hvorfor du laver den WHERE IN
Avatar billede zyfer Nybegynder
12. marts 2010 - 09:44 #2
Hej..

Fordi ProjID går igen flere gange, og jeg skal kun bruge de poste med den nyeste dato(Changeddate). Og den skal kun tag dem der har StatusID lig med 6..

ProjID  -  Sidste post registret - Men kun hvis StatusID = 6

Lidt svært og forklare.. :-)
Avatar billede Syska Mester
12. marts 2010 - 09:51 #3
hmmm ...

SÅ noget ala:

SELECT * FROM projs WHERE projid IN
(
SELECT MAX(projid) from status WHERE statusid = 6 GROUP BY projid
)

Overstående er utestet ... men burde det så ik' virke ...
Avatar billede zyfer Nybegynder
12. marts 2010 - 10:28 #4
Hej..

Virker ikke, jeg får stadig alle poster med StatusID=6, også selv om det ikke er sidste dato (Changeddate)...
Avatar billede Syska Mester
12. marts 2010 - 10:52 #5
Dvs ... du skal have MAX Date ... og den status kode som passer til ?

mvh
Avatar billede zyfer Nybegynder
12. marts 2010 - 10:59 #6
Hej..

Jeg skal bruge :

For hver ProjID skal jeg bruge den sidste (nyeste Dato), men KUN hvis StatusID er =6.

Altså, de Projekter(ProjID) der på nuværende tidspunkt(Changeddate) har status 6 (StatusID)....
Avatar billede Syska Mester
13. marts 2010 - 01:22 #7
Tænkt og ikke testet ... pseudo sql


select * from proj P
INNER JOIN ( select projid, MAX(date) from proj GROUP BY projid ) AS t1 ON P.projid = t1.projid AND p.ChangeDate = t1.ChangeDate
WHERE P.Status = 6

Den tmp table:
select projid, MAX(date) from proj GROUP BY projid
Tager senest dato og projid og joiner over på sig selv ... og sammenligner projid og dato ... og så ser om den har status id 6..

Det burde virke ... om end jeg ikke lige helt kan gennemskue din struktur. så burde det her give en ide til hvordan du kan løse det.

mvh
Avatar billede zyfer Nybegynder
13. marts 2010 - 11:28 #8
Hej..

Lige et eks...

Tabel 1 : G_Proj

ProjID - Plannededate - Task_name - Descr

EKS:
1 - 13-03-2010 - abc - lave kaffe
2 - 15-03-2010 - cba - male hus
3 - 10-04-2010 - cab - rydde sne

ProjID = Primærnøgle (Ingen dubletter)

Tabel 2 : G_projstatus

FK_Projekt - Changeddate - StatusID

EKS :
2 - 10-03-2010 - 2
2 - 11-03-2010 - 6
2 - 12-03-2010 - 5
1 - 10-03-2010 - 2
1 - 11-03-2010 - 6
1 - 13-03-2010 - 5
3 - 08-03-2010 - 5
3 - 09-04-2010 - 6

Relation:
G_Proj.ProjID - G_Projstatus.FK_Projekt

Resultat skal så være :

3 - 10-04-2010 - cab - rydde sne

Da det er den eneste der opfylder, StatusID=6 ved sidste dato..
Avatar billede Syska Mester
13. marts 2010 - 12:43 #9
ja, men har du prøvet at lave det med udgangs punkt i min tankegang ?

mvh
Avatar billede Syska Mester
13. marts 2010 - 12:44 #10
Problemet er jo at din sidste table ikke har noget unikt ... da du kun har 3 felter ... og det eneste der kan gøre rækken unik er at tage dato med ... så du har id og dato ... som kan vælge staus.

Derfor tror jeg ikke der er mange andre måder at lave det på.

mvh
Avatar billede zyfer Nybegynder
15. marts 2010 - 21:01 #11
Hej Buzzzz

Jeg har fundet en løsning der virker :

SELECT    G_PROJ.PROJID, G_PROJ.TASK_NAME, G_PROJ.DESCR, G_PROJ.PLANNEDENDDATE
FROM  G_PROJ INNER JOIN
                      G_PROJSTATUS ON G_PROJ.PROJID = G_PROJSTATUS.FK_PROJECT
                        WHERE    ((SELECT    TOP (1) STATUSID
                        FROM        G_PROJSTATUS AS G_PROJSTATUS_1
                        WHERE    (G_PROJ.PROJID = FK_PROJECT)
                        ORDER BY CHANGEDDATE DESC) = 2)
GROUP BY G_PROJ.PROJID, G_PROJ.TASK_NAME, G_PROJ.DESCR, G_PROJ.PLANNEDENDDATE
ORDER BY G_PROJ.PLANNEDENDDATE DESC


Men smid lige svar, så får du pointen.....
Avatar billede Syska Mester
16. marts 2010 - 14:10 #12
Hej,

Yes, dit løser det også ... men det andet burde nu også ...

Men alle veje fører til Rom ... næsten da :-)

mvh
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