Permalänk
Medlem

SQL-knåp

Har en lite lurig SQL-fråga som jag går bet på.

Jag har en historik-tabell med ett antal artiklar, meningen med denna är att kunna se om artikel har gått på leverans och sedan retur och eller om den finns i lager. Har en flagga, saldo som anger om artikeln finns i lager eller ej.

Alltså kan det förekomma många rader för en artikel, men om den finns i lager så förekommer det att saldo=1, och den raden är aktuell.
Exemplet nedan, artikeln BIL1 finns i lagerhylla B, senast förekommen 20110901 och har saldot 1.
Det som finns i lager är alltså, BIL1 och BIL2.
BIL3 finns alltså inte i lager, men man kan hitta historik på den.

artikel datum händelse lagerhylla saldo BIL1 20110515 inkom A 0 BIL1 20110711 flyttad B 0 BIL1 20110901 inventerad B 1 BIL2 20110910 inkom A 1 BIL3 20110501 inkom C 0 BIL3 20110530 leverans C 0

Hur gör jag nu en SQL-fråga som ger mig alla artiklar som jag inte har i lagret. Jag ska inte ha saldo=0, för då kommer ju loggningen på BIL1 och BIL2 upp. Utan bara BIL3.
Frågan ska rättare sagt visa alla artiklar där saldo=1 inte förekommer på någon rad.

Finns det någon lösning på detta?

Visa signatur

K#

Permalänk
Medlem

Går väl att lösa med en GROUP BY..
Men behöver nog egenteligen lite mer information..
Vad är primary key för tabellen?
Har datumen bättre upplösning?
Tillåter du att man lägger in saker retroaktivt, dvs. får du lägga in en händelse för en artikel med ett tidigare datum än den senaste händelsen för artikeln?

Tanken är iaf att du grupperar ihop artiklarna och hämtar ut någon sorts unik identifierare för den senaste artiklen (såsom ett högsta id, eller ett högsta datum), och sedan använder denna identifierare när du söker efter saldo=0 i en ny query.

"Pseudo-kod" lösning om bättre upplösning på datum (eller endast en händelse per artikel per datum):
SELECT artikel,saldo FROM tbl as t1 JOIN (SELECT artikel,max(datum) FROM tbl GROUP BY artikel LIMIT 1) as t2 ON t1.artikel = t2.artikel AND t1.datum=t2.datum WHERE t1.saldo='0'

"Pseudo-kod" lösning om icke-retroaktiva händelser med primary key autoincrement kolumn "id":
SELECT artikel,saldo FROM tbl as t1 JOIN (SELECT max(id) FROM tbl GROUP BY artikel LIMIT 1) as t2 ON t1.id = t2.id WHERE t1.saldo='0'

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk
Medlem

Hej! Tack för svaret.

Datetime sparas faktiskt i den upplösningen på hela dagar.
Däremot så har jag en kolumn transid som är primary key och har datatypen int, med en ökning på 1 för varje post.
Har som du skriver tillåtelse för retroaktiva datum, datumet sätts av tjänsten som inte har några restriktioner.

Ska labba lite utifrån ditt svar.

Edit: Tror jag fått till det nu utifrån ditt exempel 2.
Har väl snabbat upp koden med 100% i och med att jag får ut ett renare svar och slipper en massa onödig databastrafik.
Det jag håller på med är en tjänst som automatiskt arkiverar händelser till en sparat historik-tabell, då på artiklar som inte finns i lager.

Tack som fn.

Visa signatur

K#

Permalänk
Medlem

Hej,

Om jag tolkade din fråga rätt så borde något i stil med detta lösa din fråga

select artikel from produkt group by artikel having sum(saldo) = 0

//C

Permalänk
Medlem
Skrivet av conio:

Hej,

Om jag tolkade din fråga rätt så borde något i stil med detta lösa din fråga

select artikel from produkt group by artikel having sum(saldo) = 0

//C

Körde din fråga också och fick give or take identiskt svar. (1.5% mindre rader med din lösning)
Ska kolla vilken som passar bäst, de verkar vara lika snabba också.

Tack för hjälpen

Visa signatur

K#

Permalänk
Medlem

Har en ytterligare fråga.
Denna fråga visar alla artiklar som inte finns i lager vilket jag var ute efter:

select artikel from produkt group by artikel having sum(saldo) = 0

Om jag också bredvid artikeln vill visa en kolumn med datumet då artikeln senast blev behandlad, dvs det datumet närmast idag.

Har nu en lösning genom att läsa in en array med artiklar som frågan ovan ger, sedan köra en select top(1) from tbl

Visa signatur

K#

Permalänk
Medlem

Har en ytterligare fråga.
Denna fråga visar alla artiklar som inte finns i lager vilket jag var ute efter:

select artikel from produkt group by artikel having sum(saldo) = 0

Om jag också bredvid artikeln vill visa en kolumn med datumet då artikeln senast blev behandlad, dvs det datumet närmast idag.

Har nu en lösning genom att läsa in en array med artiklar som frågan ovan ger, sedan köra en fråga för varje individ enlig nedan.

select top(1) datum from tbl where artikel='array[n]' order by datum desc

Vore snyggt om det gick att läsa och framförallt snällare mot servern att slippa ställa en fråga per artikel...

Visa signatur

K#

Permalänk
Medlem

Om du inte har några framtida datum lagrade i databasen (och självklart datumen lagrade i ett datumformat) så borde detta ge dig det du söker

select artikel, max(datum) from produkt group by artikel having sum(saldo) = 0

//C

Permalänk
Medlem

Fantastiskt!

Din fråga fungerar finfint.

Är ingen SQL-guru så jag har gått omvägar länge genom att lösa problemen i koden, men jag kände nu att det inte var en bra lösning.

Visa signatur

K#

Permalänk
Medlem
Skrivet av atman:

Körde din fråga också och fick give or take identiskt svar. (1.5% mindre rader med din lösning)
Ska kolla vilken som passar bäst, de verkar vara lika snabba också.

Tack för hjälpen

Säker på att du testat ordentligt där?
Den bör ju rimligen säga att du har något i lager sålänge som du någon gång i tiden har haft det i lager, även om saldo=0 just nu.
Dvs.

BIL1 20110515 inkom A 0 BIL1 20110711 flyttad B 0 BIL1 20110901 inventerad B 1 BIL1 20110902 leverans B 0

Får ju sum(saldo) till 1, varav "having sum(saldo)" inte är 0.

Kanske missförstått din användning av saldo dock..

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk
Medlem
Skrivet av Zevon:

Säker på att du testat ordentligt där?
Den bör ju rimligen säga att du har något i lager sålänge som du någon gång i tiden har haft det i lager, även om saldo=0 just nu.
Dvs.

BIL1 20110515 inkom A 0 BIL1 20110711 flyttad B 0 BIL1 20110901 inventerad B 1 BIL1 20110902 leverans B 0

Får ju sum(saldo) till 1, varav "having sum(saldo)" inte är 0.

Kanske missförstått din användning av saldo dock..

Njea, jag använder saldo till att visa vilken transaktion som är aktuell, alltså BIL1 är alltid en enhet, och jag kan aldrig ha saldo=2 tex.
Saldo=1 får endast förekomma om BIL1 finns i lager, annars saldo=0. Saldo är alltså binär, skulle kunna köra datatyp bit men det blev int om jag ville ha någon annan nivå.

Ovanstående exempel får tex inte förekomma. Vid leverans som är den sista transaktionen kronologiskt sett sätts saldot=0.
Så det blir saldo 0 på alla rader när BIL1 i exemplet inte längre finns i lager, men historiken består.

Testade ovanstående kod och jag är väldigt nöjd med hur det presenteras.

Visa signatur

K#

Permalänk
Medlem
Skrivet av atman:

Njea, jag använder saldo till att visa vilken transaktion som är aktuell, alltså BIL1 är alltid en enhet, och jag kan aldrig ha saldo=2 tex.
Saldo=1 får endast förekomma om BIL1 finns i lager, annars saldo=0. Saldo är alltså binär, skulle kunna köra datatyp bit men det blev int om jag ville ha någon annan nivå.

Ovanstående exempel får tex inte förekomma. Vid leverans som är den sista transaktionen kronologiskt sett sätts saldot=0.
Så det blir saldo 0 på alla rader när BIL1 i exemplet inte längre finns i lager, men historiken består.

Testade ovanstående kod och jag är väldigt nöjd med hur det presenteras.

Okej det förklarar saken, jag hade missförstått saldo alltså.
Då håller jag med om att having sum(saldo)=0 är ett bra val (går nog att göra mer effektivt genom att bygga om den så att den inte behöver gå igenom alla saldo-rader för summering dock, men gissar att prestanda på SQL-frågan inte är något problem nu heller)

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk
Medlem
Skrivet av Zevon:

Okej det förklarar saken, jag hade missförstått saldo alltså.
Då håller jag med om att having sum(saldo)=0 är ett bra val (går nog att göra mer effektivt genom att bygga om den så att den inte behöver gå igenom alla saldo-rader för summering dock, men gissar att prestanda på SQL-frågan inte är något problem nu heller)

Att få fram alla artiklar som är intressanta tar cirka 30 sekunder. (Inkl att min kod endast ska plocka ut de äldsta)
Jag får ju ett artikelnummer och ett datum som presenteras (det nyaste datumet). Är detta datum > 365 dagar från och med idag lägger jag individen i en array och sedan backupar jag alla transaktioner utifrån artiklarna i arrayen.

Visa signatur

K#

Permalänk
Medlem
Skrivet av atman:

Att få fram alla artiklar som är intressanta tar cirka 30 sekunder. (Inkl att min kod endast ska plocka ut de äldsta)
Jag får ju ett artikelnummer och ett datum som presenteras (det nyaste datumet). Är detta datum > 365 dagar från och med idag lägger jag individen i en array och sedan backupar jag alla transaktioner utifrån artiklarna i arrayen.

Hmm, så det är endast artiklar som är äldre än 1 år som är intressanta i frågan?
Eller använder du fortfarande de som inte är äldre än ett år på något sätt från svaret?
(Annars, lägg till ett extra vilkor för HAVING där du kollar att max datumet är inom ett år)

Kör du din backup mot en annan tabell, eller sparar du det på något annat sätt?
(Annars, slå ihop en INSERT med din SELECT, och skippa mellansteget att hämta ut det till din programkod)

Är 30sekunder ett problem, eller är det en okej körtid för ditt ändamål?
(Är det ens värt att försöka optimera?)

Har du ett index på saldo? Om inte, skriver du till saldo väldigt ofta, eller kan du tänka dig att bygga ett index?
(Index på saldo skulle kunna göra allt väldigt mycket snabbare för läsning, men att underhålla ett extra index innebär ju lite långsammare skrivning)

Vilken databas använder du? (mysql, postgresql, mssql, ..)
(Bra att veta bara)

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk
Medlem
Skrivet av Zevon:

Hmm, så det är endast artiklar som är äldre än 1 år som är intressanta i frågan?
Eller använder du fortfarande de som inte är äldre än ett år på något sätt från svaret?
(Annars, lägg till ett extra vilkor för HAVING där du kollar att max datumet är inom ett år)

Kör du din backup mot en annan tabell, eller sparar du det på något annat sätt?
(Annars, slå ihop en INSERT med din SELECT, och skippa mellansteget att hämta ut det till din programkod)

Är 30sekunder ett problem, eller är det en okej körtid för ditt ändamål?
(Är det ens värt att försöka optimera?)

Har du ett index på saldo? Om inte, skriver du till saldo väldigt ofta, eller kan du tänka dig att bygga ett index?
(Index på saldo skulle kunna göra allt väldigt mycket snabbare för läsning, men att underhålla ett extra index innebär ju lite långsammare skrivning)

Vilken databas använder du? (mysql, postgresql, mssql, ..)
(Bra att veta bara)

Jag använder mig av MSSQL 2008.
Har inte något index på saldo, jag läste lite om index etc när jag skapade tabellen och fick rådet att inte använda för många. Så jag har bara ett enda index i tabellen som är kopplat till ett id bara.

Funderade på det också, går det ta fram endast de artiklarna som är äldre än ett år.
Som jag gör nu så sorterar jag ut dem i tjänsten (skriven i c#) med ett timespan.
Det är ju när jag fått fram en array med artiklar som är äldre än 1 år som det tar tid.
Måste ju köra en select * where artikel='array[i]' för varje artikel för att få fram alla transaktioner per artikel.

Helt optimalt vore om jag i kunde genom SQL-frågor få fram alla artiklar(inkl transaktioner) på artiklar äldre än 365 dagar.

Så 30 sekunder är bra, det som tar tid är som den sista biten, ta fram alla transaktioner per artikel och insert/deletea.
Jag använder mig av en annan tabell för att lägga historiken i ja.

Visa signatur

K#

Permalänk
Medlem
Skrivet av atman:

Jag använder mig av MSSQL 2008.
Har inte något index på saldo, jag läste lite om index etc när jag skapade tabellen och fick rådet att inte använda för många. Så jag har bara ett enda index i tabellen som är kopplat till ett id bara.

Funderade på det också, går det ta fram endast de artiklarna som är äldre än ett år.
Som jag gör nu så sorterar jag ut dem i tjänsten (skriven i c#) med ett timespan.
Det är ju när jag fått fram en array med artiklar som är äldre än 1 år som det tar tid.
Måste ju köra en select * where artikel='array[i]' för varje artikel för att få fram alla transaktioner per artikel.

Helt optimalt vore om jag i kunde genom SQL-frågor få fram alla artiklar(inkl transaktioner) på artiklar äldre än 365 dagar.

Så 30 sekunder är bra, det som tar tid är som den sista biten, ta fram alla transaktioner per artikel och insert/deletea.
Jag använder mig av en annan tabell för att lägga historiken i ja.

Det stämmer att man inte ska använda för många index, eftersom de kostar att underhålla dem, men det är en avvägning över hur mycket prestanda de ger.
Om dina tabeller sällan uppdateras så kan du använda index utan att tänka, men uppdateras dem ofta (insert/delete/update) så kan kostnaden bli för hög.

Har ingen tidigare erfarenhet av MSSQL, så detta blir otestat, men borde väl stämma någolunda:

SELECT artikel FROM produkt GROUP BY artikel HAVING max(saldo)=0 AND datediff(year,max(datum),getdate())>0

Detta borde alltså ge dig alla artiklar som är slut och som inte uppdaterats på över ett år. (Men ville du att alla artiklar, oavsätt om de var slut eller inte, skulle hittas baserat på datumet? Isf skippa max(saldo)=0 delen)

Bytte ut sum(saldo)=0 mot max(saldo)=0 eftersom max inte behöver gå igenom alla värden, såfort den hittar en 1:a så kan den sluta (sum måste fortsätta och beräkna summan eftersom den "kan" komma ett negativt tal, om du inte använder någon icke-negativ datatyp och SQL parsern är tillräckligt smart vid optimeringen).

Du kan sedan använda ovanstående query som subquery för att läsa ut alla transaktioner också:

SELECT * FROM produkt WHERE artikel in (SELECT artikel FROM produkt GROUP BY artikel HAVING max(saldo)=0 AND datediff(year,max(datum),getdate())>0) as t2

Och du kan sedan använda ovanstående för att skapa en INSERT för insättning i din backup-tabell, enligt:

INSERT INTO annan_tabell(artikel,datum,händelse,lagerhylla, saldo) (SELECT artikel,datum,händelse,lagerhylla,saldo FROM produkt WHERE artikel in (SELECT artikel FROM produkt GROUP BY artikel HAVING max(saldo)=0 AND datediff(year,max(datum),getdate())>0) as t2) as t3

Det som saknas då är att köra en avslutande DELETE i produkt-tabellen på artiklarna du kopierade till annan_tabell:

DELETE FROM produkt WHERE artikel in (SELECT artikel FROM produkt GROUP BY artikel HAVING max(saldo)=0 AND datediff(year,max(datum),getdate())>0) as t2

Har ingen MSSQL att testa emot, så har säkert missat paranteser och sånt, och koden är ju otestad så kör inte någon av INSERT/DELETE frågorna på data som är viktig.

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk
Medlem
Skrivet av Zevon:

Det stämmer att man inte ska använda för många index, eftersom de kostar att underhålla dem, men det är en avvägning över hur mycket prestanda de ger.
Om dina tabeller sällan uppdateras så kan du använda index utan att tänka, men uppdateras dem ofta (insert/delete/update) så kan kostnaden bli för hög.

Tabellen har extremt mycket inserts och updates, men flest är väl select-satser som körs.
Delete förekommer inte alls, förräns nu när det ska "städas".

Det ser riktigt lovande ut, har varit väldigt begränsad som sagt pga mina smala kunskaper i SQL.
Att få alla rullar direkt vore suveränt.
Har skapat en _lab -databas utifrån backupen inatt som jag testar mot.

Får problem med frågan som endast ska ta de artiklarna vars nyaste transaktion är 1 år eller äldre.
Nu får jag alla artiklar som haft en transaktion för 1 år sedan eller innan.
Det jag vill ha är alltså: alla artiklar som haft en transaktion för ett år sedan eller innan, baserat på den nyaste transaktionen.

Visa signatur

K#

Permalänk
Medlem
Skrivet av atman:

Tabellen har extremt mycket inserts och updates, men flest är väl select-satser som körs.
Delete förekommer inte alls, förräns nu när det ska "städas".

Det ser riktigt lovande ut, har varit väldigt begränsad som sagt pga mina smala kunskaper i SQL.
Att få alla rullar direkt vore suveränt.
Har skapat en _lab -databas utifrån backupen inatt som jag testar mot.

Får problem med frågan som endast ska ta de artiklarna vars nyaste transaktion är 1 år eller äldre.
Nu får jag alla artiklar som haft en transaktion för 1 år sedan eller innan.
Det jag vill ha är alltså: alla artiklar som haft en transaktion för ett år sedan eller innan, baserat på den nyaste transaktionen.

1) Hämta produkter som inte är i lager, notera när den senaste transaktionen inträffade.
2) Hämta ut alla transaktioner för produkterna som hittades ovan vars transaktionsdatum är äldre än ett år sedan den senaste transaktionen för produkten?

Är så du vill göra alltså? (det verkar ju som att du hämtade artiklarna för att få reda på transaktionerna)

Lättaste vore väl isf att hämta ut produkterna med HAVING max(saldo)=0 som tidigare, sedan joina ihop artikel och max(datum) med alla rader i tabellen (så varje artikel transaktion vet max-datum på sin senaste transaktion), och sedan bara filtrera ut resulatet med en WHERE..

Nått i stil med följande alltså:
SELECT * FROM produkt as t1 JOIN (SELECT artikel,max(datum) as maxdatum FROM produkt GROUP BY artikel HAVING max(saldo)=0) as t2 ON t1.artikel=t2.artikel WHERE datediff(year,datum,maxdatum)>0

Om det faktiskt bara är artiklarna som du var intresserade av så kan du ju då här bara gruppera på artikel igen, enligt:
SELECT artikel FROM produkt as t1 JOIN (SELECT artikel,max(datum) as maxdatum FROM produkt GROUP BY artikel HAVING max(saldo)=0) as t2 ON t1.artikel=t2.artikel WHERE datediff(year,datum,maxdatum)>0 GROUP BY artikel

Om den blir seg så skulle nog ett index på artikel kunna hjälpa en del iom. att vi joinar på artikel (visst dock att index blir dyra i ditt fall, så det beror väl på hur ofta du tänkt köra queryn)

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk
Medlem
Skrivet av Zevon:

1) Hämta produkter som inte är i lager, notera när den senaste transaktionen inträffade.
2) Hämta ut alla transaktioner för produkterna som hittades ovan vars transaktionsdatum är äldre än ett år sedan den senaste transaktionen för produkten?

Är så du vill göra alltså? (det verkar ju som att du hämtade artiklarna för att få reda på transaktionerna)

Jepp!, precis så är det tänkt att det ska fungera.
Tog din fråga och testade, men datumet verkar inte slå igenom riktigt.
Första artikeln i svaret hade senaste transaktion för 20 dagar sedan.

Är oerhört tacksam för att du hjälper till.
I nuläget har koden blivit 5x snabbare, men om jag får till det här sista att jag kan få ut samtliga artiklar(inkl all data för varje artikel)så blir går det 50x snabbare.

Visa signatur

K#

Permalänk
Medlem
Skrivet av atman:

Jepp!, precis så är det tänkt att det ska fungera.
Tog din fråga och testade, men datumet verkar inte slå igenom riktigt.
Första artikeln i svaret hade senaste transaktion för 20 dagar sedan.

Är oerhört tacksam för att du hjälper till.
I nuläget har koden blivit 5x snabbare, men om jag får till det här sista att jag kan få ut samtliga artiklar(inkl all data för varje artikel)så blir går det 50x snabbare.

Hmm okej, datediff kanske inte fungerar som jag trott, lite svårt att veta när man inte testat.. Kanske fungerar bättre att kolla mot dagar:

SELECT * FROM produkt as t1 JOIN (SELECT artikel,max(datum) as maxdatum FROM produkt GROUP BY artikel HAVING max(saldo)=0) as t2 ON t1.artikel=t2.artikel WHERE datediff(day,datum,maxdatum)>365

Annars så tycker jag att queryn ser rätt ut, den där borde ju hämta ut alla transaktioner som är 1år äldre än den senaste transaktionen för varje artikel som inte finns i lager.. Förutsatt att du inte har några datum från framtiden så borde det ju fungera som du vill alltså.
Hur ser maxdatum och datum kolumnerna ut för de rader som blir fel?

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk
Medlem
Skrivet av Zevon:

Hmm okej, datediff kanske inte fungerar som jag trott, lite svårt att veta när man inte testat.. Kanske fungerar bättre att kolla mot dagar:

SELECT * FROM produkt as t1 JOIN (SELECT artikel,max(datum) as maxdatum FROM produkt GROUP BY artikel HAVING max(saldo)=0) as t2 ON t1.artikel=t2.artikel WHERE datediff(day,datum,maxdatum)>365

Annars så tycker jag att queryn ser rätt ut, den där borde ju hämta ut alla transaktioner som är 1år äldre än den senaste transaktionen för varje artikel som inte finns i lager.. Förutsatt att du inte har några datum från framtiden så borde det ju fungera som du vill alltså.
Hur ser maxdatum och datum kolumnerna ut för de rader som blir fel?

Fantastiskt!, nu fungerar det as intended. Gjorde susen det där med att köra per day istället, vilket är ännu bättre då jag har specat per dag i ini-filen hur länge data ska finnas kvar.
Nu har jag all data jag vill ha med en enda fråga (och delfråga), så nu kan jag köra din select into för att sedan avsluta med delete.
Ska skriva om koden och testa detta fullt ut, bör bli brutalt mycket snabbare, och framförallt snällare mot servern.

Tack åter igen, har inte kommit in i relationsdatabas-tänket än känner jag.

Visa signatur

K#

Permalänk
Medlem

Hej igen,

Vill du vara väldigt high-tech så kan du ju göra utdraget och deleten i samma svep. Du kan nämligen få DELETE att även producera output om man säger som så.

Här är två referenser:
http://msdn.microsoft.com/en-us/library/ms189835.aspx
http://msdn.microsoft.com/en-us/library/ms177564.aspx

Här är ett förenklat exempel från en av sidorna.

DELETE Sales.ShoppingCartItem OUTPUT DELETED.*;

En av nackdelarna att göra på detta viset är att det är databasmotorspecifikt. Det är alltså mer portabelt att göra dessa två operationer i två svep i en transaktion (utdrag av data och sedan borttag).

//C

Permalänk
Medlem
Skrivet av conio:

Hej igen,

Vill du vara väldigt high-tech så kan du ju göra utdraget och deleten i samma svep. Du kan nämligen få DELETE att även producera output om man säger som så.

Här är två referenser:
http://msdn.microsoft.com/en-us/library/ms189835.aspx
http://msdn.microsoft.com/en-us/library/ms177564.aspx

Här är ett förenklat exempel från en av sidorna.

DELETE Sales.ShoppingCartItem OUTPUT DELETED.*;

En av nackdelarna att göra på detta viset är att det är databasmotorspecifikt. Det är alltså mer portabelt att göra dessa två operationer i två svep i en transaktion (utdrag av data och sedan borttag).

//C

Tack för tipset, skulle definitivt underlätta.
Kan tyckas vara petigt det jag håller på med, men det det handlar om ~800k rader som ska arkiveras på intervall går det spara mycket cpu-tid med optimering.

Visa signatur

K#

Permalänk
Medlem

Lånar denna tråd igen då jag har en ny SQL-fråga jag inte får till.

Jag har en tabell med datum,vikt,mottagare,artikel,order

I den finns alla artiklar uppradade, med en vikt per artikel.
Det jag vill är att summera varje order, så varje order blir 1 rad så att säga och att vikten blir summerad för alla artiklar.

TEX:
Datum Vikt Mottagare Artikel Order
2011-12-24 11 Kina lövblås 78
2011-12-24 1 Kina kratta 78

Jag vill alltså ha en fråga som ger mig detta:
2011-12-24 12 Kina 78

En summering per order, och order ska endast visas en gång (samma order, samma mottagare)
Har provat med distinct för att endast visa en order, men då får jag inte till summeringen med sum(vikt)

Edit: Har nu fått det att fungera. Möblerade om i GROUP BY.

Visa signatur

K#