|
[ jablan @ 09.07.2008. 23:53 ] @
| Ima li neko ideju kako da ovo rešim (dajem uprošćenu postavku): imam dve tabele Tabela_1 i Tabela_2 koje izgledaju ovako:
Code:
Tabela_1
Datum Predmet Kolicina
...
2008-05-04 a 5
2008-05-04 a 4
2008-05-04 a 1
2008-05-04 b 2
2008-05-04 b 7
2008-05-04 b 4
...
Tabela_2
Datum Predmet Kolicina
...
2008-05-04 b 2
2008-05-04 b 3
2008-05-04 b 5
2008-05-04 c 2
2008-05-04 c 6
2008-05-04 c 1
...
Treba mi upit koji će podatke iz ove dve tabele sumirati u ovom obliku:
Code:
Datum Predmet Sum_1 Sum_2
...
2008-05-04 a 10 0
2008-05-04 b 13 10
2008-05-04 c 0 9
...
Sum_1 je suma koja odgovara predmetu i datumu iz prve, a Sum_2 iz druge tabele.
Napominjem da se svi predmeti za određeni datum ne moraju pojaviti u obe tabele. |
[ goranvuc @ 10.07.2008. 02:37 ] @
Nesto bas ne verujem da TI ne znas resenje, ali hajde
Code:
SELECT Datum, Predmet, SUM(Kolicina1) AS Sum_1, SUM(Kolicina2) AS Sum_2
FROM (
SELECT Datum, Predmet, Kolicina AS Kolicina1, 0 AS Kolicina2 FROM Tabela_1
UNION ALL
SELECT Datum, Predmet, 0 AS Kolicina1, Kolicina AS Kolicina2 FROM Tabela_2
) AS Promene
GROUP BY Datum, Predmet
Ako si mislio bez unije i bez varijante sa referenciranjem na podupit onda javi.
[ jablan @ 10.07.2008. 08:02 ] @
Iskreno, UNION u podupitu mi uopšte nije padao na pamet. Hvala puno, ovako na prvu loptu izgleda da radi!
[ goranvuc @ 10.07.2008. 08:46 ] @
Ja sam mislio da nam postavljas nesto iz kolekcije "SQL Mozgalice" i da vec imas pripremljeno resenje
Mislim da se tesko moze izbeci UNION bez obzira koju varijaciju upita da izvedes (naravno, dok se srki ne javi sa nekim resenjem iz oracle-a)
[ zmau @ 13.07.2008. 10:59 ] @
Bez uniona ? Recimo ovako :
Code:
select coalesce(t1.predmet, t2.predmet), coalesce(t1.datum, t2.datum), coalesce(t1.kolicina1, 0) kol1, coalesce(t2.kolicina2, 0) kol2
from
(
select predmet, datum, sum(kolicina) as kolicina1
from tabela_1
group by predmet, datum
) t1
full outer join
(
select predmet, datum, sum(kolicina) as kolicina2
from tabela_2
group by predmet, datum
) t2
on t1.predmet = t2.predmet and t1.datum = t2.datum
[ ilkeNo1 @ 24.08.2008. 22:36 ] @
A kako bi sumirali ovako nesto:
Code:
Tabela_1
Datum Predmet Kolicina
...
2008-05-04 a 5
2008-05-04 a -4
2008-05-04 a -2
2008-05-04 a 5
2008-05-04 a 4
2008-05-04 a 1
2008-05-04 b 2
2008-05-04 b 7
2008-05-04 b -4
2008-05-04 b 2
2008-05-04 b 7
2008-05-04 b 4
...
u ovo:
Code:
Tabela_1
Datum Predmet Kolicina
...
2008-05-04 a 5
2008-05-04 a -6
2008-05-04 a 10
2008-05-04 b 9
2008-05-04 b -4
2008-05-04 b 13
...
Hvala vam unapred.
[ Zidar @ 26.08.2008. 13:54 ] @
@IlkeNo1:
ne moze ovo sto si trazio. Nisi dao dovoljno podataka u Tablea_1. kolko vidim, na dan 2008-05-04 , za proizvod 'A' prvo si 'sabrao' vrednost 5, pa si onda sabrao dve negatibne vrednosti, pa onda tri pozitivne za isti dan i isti proizvod. Znaci, sabirane se zasniva na odrdjenom redosldu redova u tabeli. Tu je problem. nemas nista u Tablea_1 sto bi garantovalo redosled koji si npisao u primeru. Moras da imas jes neku kolonu ili kolone koje bi omogucile da se dobije tacan reosled pre sabiranja.
Ako ti Datum recimo sdrzi i minute i sekunde, pa je jos UNIQUE, onda bi moglo. Ili da imas neki brojac redova, pa to upotrebis sortiras redove pre sabiranja.

[ ilkeNo1 @ 27.08.2008. 17:09 ] @
Citat: Ako ti Datum recimo sdrzi i minute i sekunde, pa je jos UNIQUE, onda bi moglo.
Zadrzimo se na ovoj recenici. Kako bi se to izvelo? Zamisli samo da imas UNIQUE ID umesto sekundi i munuta.
Dakle, kako izrsiti sazimanje?
Code: Tabela_1
ID Datum Predmet Kolicina
...
100 2008-05-04 a 5
101 2008-05-04 a -4
102 2008-05-04 a -2
103 2008-05-04 a 5
104 2008-05-04 a 4
105 2008-05-04 a 1
106 2008-05-04 b 2
107 2008-05-04 b 7
108 2008-05-04 b -4
109 2008-05-04 b 2
110 2008-05-04 b 7
111 2008-05-04 b 4
...
Pada mi na pamet da se naprave 2 odvojene za plus i minus, pa da se gleda ID u novim tabelama i da ako fali negde, da se prethodni sumiraju, ali ne znam kako da napisem to.
[ Getsbi @ 27.08.2008. 17:49 ] @
Jezički definisano tvoje pravilo sumiranja bi galsilo:
"Sabiraj od početka skupa prema kraju u okviru istog dana količine istog predmeta dok se ne promeni predznak i to prikaži kao zaseban zapis (zbir). Potom nastavi sabiranje po istom pravilu."
Problem sa SQL-om je što to nje proceduralan jezik, već upitni i nema Do While.... petlje sa mogućnošću ispitivanja predznaka. Ili možda grešim?
[ Zidar @ 28.08.2008. 15:30 ] @
Citat: Zadrzimo se na ovoj recenici. Kako bi se to izvelo? Zamisli samo da imas UNIQUE ID umesto sekundi i munuta.
Dakle, kako izrsiti sazimanje?
Nemoj da ocekujes da u odgovoru dopunjavamo pitanje. Pitanje je postavljeno tako da nije postojalo nista sto bi pomoglo utvrdjivanju redosleda, i za takav slucaj nema resenja. Posto si uveo ID i pretpostavku da se redosled pomocu tog ID uspostavlja, mozemo da razmotrimo resenje.
Medjutim, da bi ustedeo vreme ljudima koji odgovaraju, daj nam jendu CREATE TABLE naredbu i nekoliko INSERT INTO sa test podacima da imamo sa cim da radimo. Svaki iole komplikovani SELECT mora da se proveri pre nego damo odgovor.

Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|