07. september 2006 - 10:54Der 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.
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
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
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
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.
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
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
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.
>Jeg går ud og pudser ferrarien så den skinner når du i morgen modtager den med posten:)
Jeg glæder mig!! ;-)
Synes godt om
Ny brugerNybegynder
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.