[ bato.r @ 02.10.2009. 12:36 ] @
Vidim da je tema stara ali ja imam problem koji ne mogu da resim pa vas molim za pomoc. Sva resenja koja sam do sada pronasao vezuju se za jednu kolonu iz upita i u odnosu na nju se ispisuju redni brojevi. Moj upit je obradjen po vise kriterijuma pa mi to resenje ne odgovara. Evo primera iz tabele "kupci" koristim kolone "IDkupca", "grad", "ime". Upit je sortiran tako da su gruisani i sortirani podaci po gradovima a zatim po imenima (kao u prilogu)

IDkupac| grad | ime

5|Beograd | Aleksandar
2|Beograd | Borivoje
4|Beograd | Milos
1|Beograd | Slavisa
3|Valjevo | Branka
6|Valjevo | Nikola

i na ovakav upit trebaju mi redni brojevi zapisa. Ima li nacina da se to uradi. Ako neko ima resenje pomagajte i hvala
[ captPicard @ 02.10.2009. 13:23 ] @
Code:
SELECT COUNT(*) Rednibroj, tablica1.id_kupac,tablica1.grad, tablica1.ime
FROM tablica tablica1, tablica tablica2
WHERE tablica1.id_kupac >= tablica2.id_kupac
GROUP BY tablica1.grad, tablica1.ime, tablica1.id_kupac
ORDER BY 1


malo sam razmislio, ipak ne može ovako
[ djoka_l @ 02.10.2009. 13:46 ] @
Ovo što tebi treba naziva se "Running sum" na engleskom.
Evo upita na Goole da dobiješ informacije: http://www.google.com/search?q=sql+running+sum

Kao što lepo piše na prvom linku koji se dobije od Gugla: Displaying running totals is a common request, and there is no straightforward way to do so in SQL.
A na drugom mestu čovek lepo kaže: SQL was not designed with this capability in mind.

Ono što može da se uradi je da se uradi join slično kao što je captPicard napisao:

Code:

select count(k1.idkupac) RB,  k1.IDkupac, k1.grad, k1.ime
from kupci k1, kupci k2
where k1.grad < k2.grad
   or (k1.grad = k2.grad and k1.ime < k2.ime)
   or (k1.grad = k2.grad and k1.ime = k2.ime and k1.idkupca < k2.idkupca)
group by k1.grad, k1.ime, k1.idkupca
order by k1.grad, k1.ime, k1.idkupca


Razni dijalekti SQLa imaju bolja rešenje (RANK funkcije), ali je ovo bolje da se uradi na drugačiji način, na primer skoro svaki reporting tool ima u sebi running sum.
[ djoka_l @ 02.10.2009. 14:17 ] @
Ispravka prethodnog koda: treba zameniti "<" sa ">".
Evo kompletnog koda za testiranje:

Code:
CREATE table "KUPCI" (
    "IDKUPCA"    NUMBER NOT NULL,
    "GRAD"       VARCHAR2(40) NOT NULL,
    "IME"        VARCHAR2(255) NOT NULL
);

insert into kupci values (5,'Beograd', 'Aleksandar');
insert into kupci values (2, 'Beograd', 'Borivoje');
insert into kupci values (4, 'Beograd', 'Milos');
insert into kupci values (1, 'Beograd', 'Slavisa');
insert into kupci values (3, 'Valjevo', 'Branka');
insert into kupci values (6, 'Valjevo', 'Nikola');

select count(k1.idkupca) RB, k1.IDkupca, k1.grad, k1.ime
  from kupci k1, kupci k2
 where k1.grad > k2.grad
    or (k1.grad = k2.grad and k1.ime > k2.ime)
    or (k1.grad = k2.grad and k1.ime = k2.ime and k1.idkupca > k2.idkupca)
    or (k1.grad = k2.grad and k1.ime = k2.ime and k1.idkupca = k2.idkupca)
 group by k1.grad, k1.ime, k1.idkupca
 order by k1.grad, k1.ime, k1.idkupca;
 
RB  IDKUPCA GRAD    IME
1   5       Beograd Aleksandar
2   2       Beograd Borivoje
3   4       Beograd Milos
4   1       Beograd Slavisa
5   3       Valjevo Branka
6   6       Valjevo Nikola
[ bato.r @ 03.10.2009. 23:20 ] @
Hvala djoka_i radi sve super, mnogo si mi pomogao a nadam se da će i drugim kolegamo ovo biti od koristi.