Jag har en tabell med följande data:
[tabell.Artikelnr] - [tabell.Summa]
1 | 100
1 | -100
2 | 50
2 | -25
2 | -25
3 | 100
3 | -50
I tabellen förs artiklar in till tillsammans med sitt värde. Meningen är att denna tabell ska gå +/- 0 på varje artikel. Jag vill nu göra en query mot denna tabell där jag tar ut varje rad där det finns en artikel vars totalsumma inte går jämnt ut. I fallet ovan ska alltå queryn ge de två sista raderna då artikelnr 3 ger en diff på totalt -50
För att krånga till det lite så vill jag dessutom att queryn bara tar ut artiklar där avvikelsen är större eller mindre än 10 samt -10
Detta är säkert en nybörjarfråga för er proffs men jag tar hjärtligt emot all hjälp jag kan få :)
SELECT Artikelnr, SUM(Summa)
FROM tabell
GROUP BY Artikelnr
HAVING ABS(SUM(Summa)) > 10
Då får du ut artikelnummer samt summan i de fall där den diffar för mycket.
GROUP BY slår ihop alla rader med samma artikelnummer så att summan beräknas för varje enskilt artikelnummer. Utelämnar du GROUP BY beräknas den totala summan för allt i tabellen.
HAVING fungerar ungefär som WHERE men kan använda värden beräknade av så kallade aggregatsfunktioner, (funktioner som beräknar saker utifrån flera rader) som SUM i detta fall.
ABS beräknar absolutvärdet, alltså tar bort eventuella minustecken, enkelt uttryckt.
I praktiken kan denna fråga vara aningen ineffektiv. Detta läser man normalt genom att lagra, i detta fall summan, i ett fält i tabellen som innehåller produkterna. Då måste den summan uppdateras varje gång det sker en ny order eller betalning eller vad nu denna tabell lagrar.
Sitter och leker för fullt och detta verkar fungera bra. Jag har en följdfråga. Det finns ytterligare ett fält som heter datum. Kan jag i min sträng bara ta ut data där den tidigare transaktionen per artikel skedde efter datum X?
I detta fall skedde senaste transaktionen på artikel 3 2011-12-06.
I min query är jag bara intresserad av att ta ut poster där första transaktionen skedde tidigast 2011-12-12. I detta fall ska då artikel 3 ej dyka upp i listan trots att det finns en diff.
Jag får nu min lista med artiklar med avvikelser. I samma tabell finns ju fältet datum. Kan jag i min query få ut alla rader kopplade till artikelnumret så jag kan se transaktionshistoriken?
Tex artikelnr 3. Nu får jag ut en lista med en post enligt nedan:
Artikelnr | summa
3 | 50
Jag skulle vilja ha den så här:
Artikelnr | summa | datum
3 | 100 | Datum 1
3 | -50 | Datum 2
138 ms totalt · 3 externa anrop · v20260731065814-full.55e59744