Avatar billede lazeric Nybegynder
27. august 2008 - 11:09 Der er 9 kommentarer og
1 løsning

Hjælp til at fjerne dubletter fra udtræk

Jeg skal lave et udtræk fra en tabel med en masse ordre. Der er flere ordre per kunde. Jeg vil vise alle kunders sidste ordre.
Kunderne kan identificeres med "kundeID" og ordrene er nummereret sekventielt, så jeg skal kun have én linie per "KundeID" og det skal være den med det højeste tal i "OrdreID".

SELECT DISTINCT
TOP 100 PERCENT KundeID, OrdreID
FROM        dbo.Ordre_view o1
Avatar billede pidgeot Nybegynder
27. august 2008 - 11:13 #1
Der er jo altid:

SELECT KundeID, MAX(OrdreID) FROM dbo.Ordre_view o1 GROUP BY KundeID
Avatar billede lazeric Nybegynder
27. august 2008 - 11:56 #2
Det virker umiddelbart, men problemet sker når jeg henter endnu en kollonne som indeholder et portnummer. Hvis der er flere ordrer på en kunde, så står der typisk noget forskelligt portnummer.

SELECT    KundeID, MAX(OrdreID) AS Ordre_ID, portnummer
FROM        dbo.Ordre_view o1
GROUP BY KundeID, portnummer

Når jeg kører den får jeg dubletter. Der står forskellige ting i "portnummer", men jeg vil kun have den med højeste "ordreID"
Avatar billede aaberg Nybegynder
27. august 2008 - 12:05 #3
Prøv noget lignende dette:

SELECT    KundeID, MAX(OrdreID) AS Ordre_ID, portnummer
FROM        dbo.Ordre_view o1
GROUP BY KundeID, portnummer
having OrdreID = MAX(OrdreID)
Avatar billede lazeric Nybegynder
27. august 2008 - 12:23 #4
Jeg har nu prøvet:

SELECT    KundeID, MAX(OrdreID) AS Ordre_ID, portnummer
FROM        dbo.Ordre_view o1
GROUP BY KundeID, portnummer
HAVING      (OrdreID = MAX(OrdreID))

Men jeg får fejlen "Column 'o1.OrdreID' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause"
Sætter jeg OrdreID i GROUP BY får jeg stadig dubletter.
Avatar billede aaberg Nybegynder
27. august 2008 - 13:45 #5
Hva så med:

SELECT    KundeID, OrdreID AS Ordre_ID, portnummer
FROM        dbo.Ordre_view o1
where o1.OrdreID = (select max(v.ordreid)
                from dbo.ordre_view v
                where v.kundeID= o1.KundeID)
Avatar billede lazeric Nybegynder
27. august 2008 - 14:03 #6
Så var den der! Tak for det :-)
husk at lægge et svar.
Avatar billede aaberg Nybegynder
27. august 2008 - 14:32 #7
svar :-)
Avatar billede lazeric Nybegynder
03. september 2008 - 11:22 #8
Måske du lige kan svare lidt mere... det virker nemlig alligevel ikke helt efter hensigten da jeg har fundet en lille twist :-)

Jeg skal bruge linien med højeste "ordreID" hvor "ProduktNr" er "235", men hvis ikke der er en linie hvor "ProduktNr" = "235", så skal den bare tage den højeste ordre, som den gør nu...
Avatar billede aaberg Nybegynder
03. september 2008 - 11:47 #9
Prøv at se om det her virker.

SELECT    KundeID, OrdreID AS Ordre_ID, portnummer, ProduktNr
FROM        dbo.Ordre_view o1
where o1.OrdreID = isnull((select max(v.ordreid)
                from dbo.ordre_view v
                where v.kundeID= o1.KundeID
                and v.ProduktNr = 235)
                ,(select max(v.ordreid)
                from dbo.ordre_view v
                where v.kundeID= o1.KundeID))
Avatar billede lazeric Nybegynder
03. september 2008 - 12:36 #10
Klasse! Tak igen :-)
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