Stötte på ett litet problem, och blev förvånad över hur svårt det var. Om vi skiter i bakgrundsstoryn och accepterar detta (jag är 100% på att det måste lösas så här), så har vi en tabell: Ska period ha ett hopp mellan 3 och 5? <code> <b>>Ska period ha ett hopp mellan 3 och 5?</b> Och som en sista twist, låt säga att vi utöver detta då har år- och kategori-kolumner:"Deackumulera" i sql?
Period, Ackumulerat Värde
1, 100
2, 150
3, 250
5, 400
Utöver detta finns det också ytterligare nycklar - låt säga en kategori. Ovanstående finns då också i motsvarande sekvenser för andra kategorier. (Sen finns det år också, men det går att lösa)
Vad jag nu vill ha är helt enkelt skillnaden mellan dem:
1, 100
2, 50
3, 100
5, 150
Men jag får inte ihop någon vettig lösning, bara monsterhistorier i 4-5 steg. (db: sqlserver 2005). Någon som har något förslag?Sv: "Deackumulera" i sql?
Annars hade något liknande detta fungerat;SELECT t1.period, t1.ack, (ISNULL(t2.ack, 0)-t1.ack) diff
FROM tabell1 t1
LEFT JOIN tabell1 t2 ON t2.period = (t1.period+1)
ORDER BY t1.period
Sv: "Deackumulera" i sql?
create table t(period int,ack int);
insert into t values(1,100);
insert into t values(2,150);
insert into t values(3,250);
insert into t values(5,400);
select period,
Ack - coalesce((select Ack
from t
where period =
(select max(period)
from t
where period < q.period)),0)
from t as q;
</code>Sv:"Deackumulera" i sql?
Jepp, det var därför jag skrev just så... =)
Men Lars lösning ser ju åtminstone ut att fungera bra. Jag ska testa den varianten. Tack till båda!Sv: "Deackumulera" i sql?
Kategori, År, Period, Ackumulerat Värde
A, 2010, 1, 100
A, 2010, 2, 150
A, 2010, 3, 250
A, 2010, 5, 400
B, 2009, 11, 75
B, 2010, 2, 150
B, 2010, 9, 315
B, 2011, 3, 500
Hur löser man det snyggast?
Detta för att få per kategori, kanske?
select <b>kat</b>, period,
Ack - coalesce((select Ack
from t
where period =
(select max(period)
from t
where period < q.period <b> and kat = q.kat</b>)),0)
from t as q;
Men vad är bäst för året? Spontant tänker jag på den halvfula men fullt fungerande lösningen year*100 + period alternativt year*12 + period.
Finns det något bättre?