Jag har ett lite lurigt problem. I mitt bagerisystem ska det finnas en ordermall som vet ungefär vad kunden brukar ta. Ordermallen är ett register som består av ett antal orderrader, varje orderrad har ett kundid och ett datum/tid-fält. Nu är det så att ordermallen måste rensas, dels för att den gör mindre nytta efter ett visst antal rader, dels därför att annars skulle den ständigt växa. Eftersom jag vill att ordermallen ska fungera bra hela tiden så vill jag inte rensa hela ordermallen för en kund. Jag hade tänkt mig ungefär så här: Ordermallen för en kund ska vara max 60 rader stor. Om den är större än 60 ska de äldsta raderna tas bort så att storleken blir 60. Detta ska göras varje gång programmet startas. DELETE FROM ordermalltabell WHERE kundid = @kundid AND pkid NOT IN (SELECT TOP 60 pkid FROM ordermalltabell WHERE kundid = @kundid ORDER BY datumkolumn DESC) Fast iofs, en bättre är kanske: Helt korrekt SQL. Bra! Eh, det där hänger jag inte riktigt med på? Det är ju inte alls samma sak som du frågade efter väl? Det ger dig väl en lista på 60 produkter (i ospecifierad ordning eftersom ingen ORDER BY finns), hur många rader den produkten finns med på (inom det datumintervall man anger) samt det högsta datumet den produkten finns med på. Eller är jag helt snurrig? Precis som du säger, och Order By behövs inte här. Det fixas senare, i programmet. Det spelar ingen roll för när väl ordermallen är inläst kommer programmet att hoppa runt i ordermallen. OK, men vad jag menade med att det verkar konstigt med att använda TOP 60 utan ORDER BY är att det kan (teoretiskt sett åtminstone) ge olika resultat varje gång den körs. Dessutom tycker jag inte alls den sql-satsen kan användas för att plocka ut vilka produkter en kund ska beställa (som en ordermall), vilket väl är meningen med den? Jag har testat den, och den fungerar för mig. Dessutom ger den samma resultat varje gång den körs. OK, fungerar den så är det nog jag som inte förstått designen riktigt. Behöver den verkligen inte filtrera på kund?Rensa i ordermall
Någon ide om hur jag ska lösa det här med SQL?
Jag hade tänkt att arbeta med det här idag, men får jag inte svar idag så får jag arbeta med det när jag kommer på hur man ska göra, eller får svar här.
Tack på förhand!
/JörgenSv: Rensa i ordermall
Sv: Rensa i ordermall
DELETE FROM ordermalltabell
WHERE kundid = @kundid
AND datumkolumn < ALL(SELECT TOP 60 datumkolumn FROM ordermalltabell WHERE kundid = @kundid ORDER BY datumkolumn DESC)Sv: Rensa i ordermall
Snackade med Trash i chatten, och vi löste det på ett annat sätt, genom att ta ordermallen från orderhistoriken. Så här:
select top 60 produkt, count(produkt) as antal, max(datum)
from orderhistorik
where datum >= dateadd(mm,-6,#valfritt datum#)
group by produkt, max(datum)
Inget ordermallsregister alltså.
Nu återstår att se hur det funkar.
/JörgenSv: Rensa i ordermall
Sv: Rensa i ordermall
Det som gör det hela lite snurrigt är kanske att jag nu inte har ett extra register för ordermallen utan använder mig av orderhistoriken. Därför behövs ju inga rader tas bort heller.
Det bör tilläggas att om Trash inte hade föreslått den här lösningen så hade nog Christoffers lösning fungerat utmärkt. Men nu löste jag det alltså på det här sättet. SQL'en är dock lite felaktig. Så här ska den vara:
select top 60 produkt, count(produkt) as antal, max(datum)
from orderhistorik
where datum >= dateadd(mm,-6,#valfritt datum#)
group by produkt
Egentilgen är väl kanske datumbegränsningen lite onödig i det här fallet. Men jag tror ordermallen blir mer precis på det sättet.
/JörgenSv: Rensa i ordermall
Sv: Rensa i ordermall
Nu har jag inte så jättemånga order inkörda eftersom programmet inte är klart ännu. Därför är det kanske lite svårt att se huruvida ordermallen fungerar.
Jag tar gärna emot ytterligare förslag, men nu ska ordermallen tas ifrån orderhistoriken och inte ett eget register som förut.
/JörgenSv: Rensa i ordermall
Att den kan ge olika resultat sa jag därför att den innehåller en TOP 60 utan en ORDER BY. Du kommer förmodligen att få samma resultat varje gång, men det finns inget som _garanterar_ det. En mängd är per definition osorterad.