[ Blue82 @ 17.03.2013. 10:37 ] @
Code (sql):

DECLARE @tabla TABLE  (Sifra INT, Naziv nvarchar(50), Konto INT, Duguje INT, Potrazuje INT)
INSERT INTO @tabla SELECT 1, 'Preduzece 1', 20200, 1000, 1000
INSERT INTO @tabla SELECT 2, 'Preduzece 2', 20200, 500, 500
INSERT INTO @tabla SELECT 1, 'Preduzece 1', 43300, 1, 2
INSERT INTO @tabla SELECT 2, 'Preduzece 2', 43300, 100, 50

 


Potrebna mi je pomoc oko spajanja 2 query-a (pretpostavljam da bi se to koristilo u mom primeru).
Jedan upit je

Code (sql):

SELECT Sifra, Naziv, SUM(duguje) AS SumaDuguje, SUM (potrazuje) AS SumaPotrazuje
FROM @tabla
WHERE konto=20200
GROUP BY sifra, Naziv
 


A drugi upit je:

Code (sql):

SELECT Sifra, Naziv, (SUM(duguje)-SUM (potrazuje)) AS SaldoDobavljac
FROM @tabla
WHERE konto=43300
GROUP BY sifra, Naziv
 


Kao resenje zeleo bih da dobijem:
Sifra, Naziv, (SumaDuguje, SumaPotrazuje) kada je konto 20200 i u nastavku tabele (SumaDuguje- SumaPotrazuje) kada je konto 43300

Ne znam da li je ovo dovoljno razumljivo pa cu pojasniti na drugaciji nacin.
Saldo odredjenog konta (npr. konta 20200) je razlika njegove dugovne i potrazne strane.
Meni je potreban upit koji ce ispisati Naziv, SumuDuguje zatim SumuPotrazuje konta 20200, grupisanu po sifri a poslednja kolona treba da je saldo (dakle razlika SumeDuguje i SumePotrazuje konta 43300 takodje grupisanu po sifri), ili receno u jednoj recenici, na prvi upit (gore prikazan) potrebno je nalepiti kao poslednju kolonu resenje drugog upita.


[Ovu poruku je menjao Blue82 dana 17.03.2013. u 12:05 GMT+1]
[ plague @ 17.03.2013. 12:27 ] @
Code (sql):

SELECT
     t1.Sifra,
     t1.Naziv,
     SUM(t1.duguje) AS SumaDuguje,
     SUM (t1.potrazuje) AS SumaPotrazuje,
     (SUM(t2.duguje)-SUM (t2.potrazuje)) AS SaldoDobavljac
FROM @tabla t1
LEFT JOIN @tabla t2 ON t1.Sifra = t2.Sifra AND t2.Konto = 43300
WHERE t1.konto=20200
GROUP BY t1.sifra, t1.Naziv
 


[Ovu poruku je menjao plague dana 17.03.2013. u 16:34 GMT+1]
[ drvlada75 @ 17.03.2013. 13:14 ] @
Code:


select 
    a.sifra, 
    a.naziv, 
    sum (a.duguje) as sumaduguje, 
    sum (a.potrazuje) as sumapotrazuje, 
    b.saldodobavljac 
from @tabla a,

(SELECT Sifra, 
        Naziv, 
        (SUM(duguje)-SUM (potrazuje)) AS SaldoDobavljac
FROM @tabla WHERE konto='43300' GROUP BY sifra, Naziv) b

where a.konto='20200'  and a.sifra=b.sifra
group by a.sifra, a.naziv , b.saldodobavljac
order by a.sifra

[ Blue82 @ 17.03.2013. 14:09 ] @
Hvala oboma.
[ djoka_l @ 17.03.2013. 15:00 ] @
Jadna izmena:

Umesto LEFT JOIN u upitu koji je napisao plague treba staviti FULL OUTER JOIN. Ovo je tipična situacija kada se koristi full outer join. Moguće je da postoje klijenti koji imaju knjiženje na jednom kontu, a nemaju na drugom, pa će full outer join da pokupi i takve slučajeve.

Kako je sada napisano, upita daje SAMO klijente koji imaju na 20200 I NA 43300 dok će oni koji imaju na jednom ali ne i na drugom kontu biti izostavljeni iz rezultata.

Uzgred, konto treba da bude varchar tipa (zbog klase 0, tj. zato što konto može da ima nule napred koje se ne sačuvaju kada se stave u int).

P.S. Vidiš Blue82 kako brzo dobiješ odgovor kada postaviš detaljno pitanje sa test podacima i strukturom tabele
[ plague @ 17.03.2013. 16:02 ] @
@djoka_l je u pravu, ali nece moci samo FULL JOIN da se ubaci nego mora dodatno da se izmeni. Nisam siguran da li je ovo najoptimalnije resenje, ali radi:

Code (sql):

SELECT
     t1.Sifra,
     t1.Naziv,
     SUM(t3.duguje) AS SumaDuguje,
     SUM (t3.potrazuje) AS SumaPotrazuje,
     (SUM(t2.duguje)-SUM (t2.potrazuje)) AS SaldoDobavljac
FROM @tabla AS t1
LEFT JOIN @tabla t2 ON t1.Sifra = t2.Sifra AND t1.Konto = 43300 AND t2.Konto = 43300
LEFT JOIN @tabla t3 ON t1.Sifra = t3.Sifra AND t1.Konto = 20200 AND t3.Konto = 20200
WHERE t1.Konto = 20200 OR t1.Konto = 43300 --elimise rezultate koji ne spadaju ni u jedan od dva Konto-a
GROUP BY t1.sifra, t1.Naziv
 


Edit: Izgleda da nije tacno, moracu da unesem jos podataka da testiram pa cu editovati.

[Ovu poruku je menjao plague dana 17.03.2013. u 17:36 GMT+1]
[ plague @ 17.03.2013. 16:37 ] @
Mislim da je sada skroz tacno, ali najbolje je da @Blue82 proveri na pravim podacima:

Code (sql):

SELECT
     t1.Sifra,
     t1.Naziv,
     SUM(t3.duguje) AS SumaDuguje,
     SUM (t3.potrazuje) AS SumaPotrazuje,
     (SUM(t2.duguje)-SUM (t2.potrazuje)) AS SaldoDobavljac
FROM (SELECT DISTINCT Sifra, Naziv, Konto FROM @tabla) AS t1
LEFT JOIN @tabla t2 ON t1.Sifra = t2.Sifra AND t1.Konto = 43300 AND t2.Konto = 43300
LEFT JOIN @tabla t3 ON t1.Sifra = t3.Sifra AND t1.Konto = 20200 AND t3.Konto = 20200
WHERE t1.Konto = 20200 OR t1.Konto = 43300 --elimise rezultate koji ne spadaju ni u jedan od dva Konto-a
GROUP BY t1.sifra, t1.Naziv
 
[ djoka_l @ 17.03.2013. 16:43 ] @
Ono što će sigurno raditi je union

Code (sql):

SELECT sifra, naziv, SUM(duguje), SUM(potrazuje), SUM(saldo43300)
FROM (
   SELECT sifra,naziv, SUM(duguje) AS duguje, SUM(potrazuje) AS potrazuje, 0 AS saldo43300
   FROM @tabla
   WHERE konto = 20200
   GROUP BY sifra, naziv
   UNION
   SELECT sifra, naziv, 0, 0, SUM(duguje) - SUM(potrazuje)
   FROM @tabla
   WHERE konto = 43300
   GROUP BY sifra, naziv)
GROUP BY sifra, naziv
 


Ovo, naravno može da se napiše i bez UNION, samo onda bi] trebalo da se koristi CASE...
[ drvlada75 @ 17.03.2013. 18:54 ] @
Da, UNION i dodavanje nulica u upite definitivno resava problem.
Treba misliti na sve slucajeve koji se mogu desiti.
[ Blue82 @ 17.03.2013. 20:57 ] @
Citat:
P.S. Vidiš Blue82 kako brzo dobiješ odgovor kada postaviš detaljno pitanje sa test podacima i strukturom tabele


@djoko, do prejkuce ja nisam ni znao da kreiram tabelu sa test podacima, tako da to nisam ni mogao uraditi. Naprosto video sam sta si ti uradio pa zakljucio kako se to radi. Takodje od nekoga ko se tek prikljuci ovom delu foruma i napise prvi post, ne moze se ni ocekivati da poznaje ovdasnju kulturu...

Sutra cu isprobati na realnim podacima.

P.S. jedino sto mi sad trenutno nije jasno je to sto sam juce odstampao jedan primer (isecak iz jedne knjige kratak pregled komandi) gde opisuju LEFT JOIN na nacin da ce on spojiti i ona polja koja nemaju u obe tabele, s tim sto ce zapis koji fali ostati NULL, a vi ovde pricate da ce biti izostavljeni zapisi koji nemaju u obe tabele?
[ plague @ 17.03.2013. 21:13 ] @
Ako imas dve tabele t1 i t2, i uradis LEFT JOIN on ce vratiti sve rezultate iz t1 cak iako nije uspeo da uradi JOIN sa recordom iz tabele t2, medjutim nece vratiti ako postoji record iz t2, a ne postoji u t1.