Avatar billede wildthing Nybegynder
07. september 2006 - 10:54 Der er 14 kommentarer og
1 løsning

Endnu mere Group by

Midt i al regnvejret får man på et eller andet tidspunkt brug for lidt succes. Vil eksperterne hjælpe med det??

Jeg har en tabel en simplificeret SQL streng:

SELECT GUID, vare, pris, generateddate, kundeID, validityperiod
FROM  Prisliste
WHERE  validtyperiod = 2006 AND KundeID = 'Olfert'
Order by vare

Jeg får altså en prisliste til en kunde (Olfert for 2006)

Problemet er at i løbet af året kan der komme en ny prislinie ind på en vare (den gamle må ikke slettes, og kan ikke mærkes udover at generateddate fortæller mig hvilken der er nyest). Nu får jeg så to linier for en given vare, og jeg vil kun se den seneste. ved at tilføje MAX(generateddate) i select og lave en group by skulle det jo kunne lykkes, men mit problem er at jeg skal have GUID feltet vist, og da den jo er unik for hver linie kommer begge linier stadig med. Jeg kan ikke rigtig bruge MAX og lignende på dette felt.

på forhånd tak:)
Avatar billede wildthing Nybegynder
07. september 2006 - 10:56 #1
jeg kaster en ferrari og en strandtur oveni pointene:)
Avatar billede teepee Nybegynder
07. september 2006 - 11:02 #2
Kan du bruge:
SELECT GUID, vare, pris, generateddate, kundeID, validityperiod
FROM  Prisliste
WHERE  validtyperiod = 2006 AND KundeID = 'Olfert'
and (vare, generateddate) in (select vare, max(generateddate)
                              from prisliste
                              where validtyperiod = 2006 AND KundeID = 'Olfert'
                              group by vare)
Order by vare
Avatar billede lorentsnv Nybegynder
07. september 2006 - 11:05 #3
Jeg går ud fra at varenummer sammen med generateddate er unikt. Dvs. at en vare ikke har to priser på nøjaktig same generateddate.

SELECT GUID, vare, pris, generateddate, kundeID, validityperiod
FROM  Prisliste
INNER JOIN (
    SELECT vare, max(generateddate) as generateddate
    FROM Prisliste
    GROUP BY Vare
    ) MaxVarePrisDato
    ON Prisliste.Vare = MaxVarePrisDato.Vare and Prisliste.generateddate = MaxVarePrisDato.generateddate
WHERE  validtyperiod = 2006 AND KundeID = 'Olfert'
Order by vare
Avatar billede lorentsnv Nybegynder
07. september 2006 - 11:08 #4
Rettelse
SELECT p.GUID, p.vare, p.pris, p.generateddate, p.kundeID, p.validityperiod
FROM  Prisliste p
INNER JOIN (
    SELECT vare, max(generateddate) as generateddate
    FROM Prisliste
    GROUP BY Vare
    ) MaxVarePrisDato
    ON p.Vare = MaxVarePrisDato.Vare and p.generateddate = MaxVarePrisDato.generateddate
WHERE  p.validtyperiod = 2006 AND p.KundeID = 'Olfert'
Order by p.vare
Avatar billede wildthing Nybegynder
07. september 2006 - 11:40 #5
Tak for input. Mails er tilsyneladende 30min forsinket i øjeblikket. Jeg kaster mig over forslagene straks i mit mere komplicerede miljø...
Avatar billede wildthing Nybegynder
07. september 2006 - 12:57 #6
lorentsnv>
dit input giver mig kun de linier der er opdateret på senest fundne (altså MAX) dato. Det jeg skal bruge er alle linier, men hvor der er flere linier per vare skal den vise den seneste genrererede.
Avatar billede wildthing Nybegynder
07. september 2006 - 12:59 #7
således ser min test ud lorentsnv..
SELECT    p.CRM_accountID, p.ID, p.s_GUID, p.ID AS Expr1, p.generateddate, p.validity
FROM        netpricelists AS p INNER JOIN
                          (SELECT    ID, MAX(generateddate) AS generateddate
                            FROM          netpricelists
                            GROUP BY ID) AS MaxVarePrisDato ON p.ID = MaxVarePrisDato.ID AND p.generateddate = MaxVarePrisDato.generateddate
WHERE    (p.CRM_accountID = 'fc0bdc28-79d4-da11-9672-00137240d500') AND (p.validity = 2006)
ORDER BY p.ID
Avatar billede lorentsnv Nybegynder
07. september 2006 - 13:08 #8
Prøv med at lave selecten om til en left join:

SELECT    p.CRM_accountID, p.ID, p.s_GUID, p.ID AS Expr1, p.generateddate, p.validity
FROM        netpricelists AS p LEFT JOIN
                          (SELECT    ID, MAX(generateddate) AS generateddate
                            FROM          netpricelists
                            GROUP BY ID) AS MaxVarePrisDato ON p.ID = MaxVarePrisDato.ID AND p.generateddate = MaxVarePrisDato.generateddate
WHERE    (p.CRM_accountID = 'fc0bdc28-79d4-da11-9672-00137240d500') AND (p.validity = 2006)
ORDER BY p.ID
Avatar billede wildthing Nybegynder
07. september 2006 - 13:12 #9
så fik jeg alle linier med inklusive dupletter
Avatar billede lorentsnv Nybegynder
07. september 2006 - 13:12 #10
Jeg håber jeg forstår dig rigtig, at du vil finde max pris på varen, uafhængig af hvilken kunde. Hvis du skal have max pris på varen på den enkelte kunde, må du tage CRM_accountID med i den inderste select.
Avatar billede lorentsnv Nybegynder
07. september 2006 - 13:13 #11
Hvad er det for nole dupletter?

Kan det klares med at bruge en SELECT DISTINCT i yderste SQL?
Avatar billede lorentsnv Nybegynder
07. september 2006 - 13:28 #12
Jeg tror jeg har lidt svært ved at forstå logiken i strukturen for din tabel.
Hvorfor har du KundeID (p.CRM_accountID) med i en pristabel?
Avatar billede wildthing Nybegynder
07. september 2006 - 13:34 #13
vi har prider per kunde, og derfor er der en kundeID per linie. strukturen har jeg arvet:)

Men vent lige lidt. Jeg tror måske at dit først bu kunne være OK. Min simple test snyder mig lidt. jeg vender tilbage
Avatar billede wildthing Nybegynder
07. september 2006 - 14:15 #14
Den var OK lorentsnv. Jeg går ud og pudser ferrarien så den skinner når du i morgen modtager den med posten:)
Mange tak - Wildthing
Avatar billede lorentsnv Nybegynder
07. september 2006 - 14:22 #15
>Jeg går ud og pudser ferrarien så den skinner når du i morgen modtager den med posten:)

Jeg glæder mig!! ;-)
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