mickolMedlem sedan jan. 20127 inlägg Hej
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å :)
LedelMedlem sedan dec. 2004736 inlägg SELECT Artikelnr, SUM(Summa) AS Diff
FROM tabell
GROUP BY Artikelnr
HAVING Diff < -10 OR Diff > 10
Välkommen till webForum.
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.
mickolMedlem sedan jan. 20127 inlägg Tack!
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?
Se exempel här:
1 | 100 | 2011-12-01
1 | -100 | 2011-12-01
2 | 50 | 2011-12-01
2 | -25 | 2011-12-01
2 | -25 | 2011-12-01
3 | 100 | 2011-12-05
3 | -50 | 2011-12-06
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.
SELECT Artikelnr, SUM(Summa)
FROM tabell
GROUP BY Artikelnr
HAVING ABS(SUM(Summa)) > 10 AND MIN(Datum) >= '2011-12-12'
Fast med dina exempeldata skulle ju ingenting dyka upp eftersom alla transaktioner skedde före datumet ifråga.
mickolMedlem sedan jan. 20127 inlägg Tack!
Bumpar lite då jag har en relaterad fråga.
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