|
[ Mikelly @ 04.02.2008. 11:30 ] @
| Imam tabelu ulaza (idulaz, zvanican) povezanu tabelu sa podacima ulaza (iddata, idartikal, kolicina) i tabelu artikala (idartikal, naziv). Isto tako i za izlaze.
Meni treba jedan sql upit koji ce mi izracunati razliku ukupne kolicine u ulazima i izlazima po artiklima, i isto to samo za nezvanicne ulaze i izlaze.
Ja sam to toboz rijesio sa 4 subqueryja, od kojih mi svaki racuna sumu kolicina u ulazima ili izlazima pa ih poslije vezem raznim joinovima, a tu jos moram ubacit i naziv artikla sto jos vise komplikuje upit. Ovo pisem sa mobilnog, postavicu kasnije ono sto sam ja zamutio, pa vas molim za komentare i pomoc |
[ chachka @ 04.02.2008. 12:13 ] @
Pogledaj top temu o pravilima foruma baza podataka. Tamo je pod 3 navedeno kako da postavis pitanje vezano za SQL upit.
[ priki @ 05.02.2008. 07:53 ] @
i objasni po kojoj metodi radis ulaze tj izlaze
fifo, lifo, hifo ili kako ?
[ Mikelly @ 05.02.2008. 13:18 ] @
Ok, prosli post nije bio bas sjajan, pa cu sad probat da to malo bolje objasnim.
Prvo problematika, imam ulaze/izlaze koji mogu biti zvanicni ili nezvanicni. Treba mi sql upit koji ce mi dati sumarno razliku artikala koji su usli i koji su izasli na svim fakturama i isto to samo na nezvanicnim fakturama. Dakle, taj sql upit treba da izgleda kao:
ID_Artikal, Sifra_Artikla, Naziv_Artikla, Stanje_ukupno, Stanje_nezvanicno.
Imam tabele:
1. Artikli (ID_Artikal, Sifra_Artikla, Naziv_Artikla,...);
2. Ulazi / Izlazi (ID, Zvanican, Datum, ...);
3. Ulazi_data / Izlazi_data (ID_data, Ulaz/Izlaz, Artikal, Kolicina, ...).
Tabele Ulazi/Izlazi i Ulazi_data/Izlazi_data su povezane stranim kljucem Ulaz/Izlaz u tabelama Ulazi_data/Izlazi_data.
Tabele Artikli i Ulazi_data/Izlazi_data su povezane stranim kljucem Artikal u tabelama Ulazi_data/Izlazi_data.
U tabeli Ulazi/Izlazi nalazi se polje Zvanican koje govori da li je ulaz/izlaz zvanican ili ne.
Evo kako sam ja to pokusao da rijesim:
Preko 4 podupita.
Prvi set od dva podupita. Svaki od njih racuna ukupnu kolicinu artikala (u ulazima, tj. izlazima). U svakom od njih sam koristio jedan LEFT JOIN da bih povezao tabelu artikala sa tabelama ulazi_data/izlazi_data. Tako dobijem za svaki artikal koliko komada ga je uslo (u jednom podupitu), pa koliko ga je izaslo (u drugom). Ta dva podupita potom vezem LEFT JOIN-om jer ako je neki artikal usao ne mora da znaci i da je i izasao.
Potom pravim nova dva podupita, sada samo za nezvanicne fakture. Oni su malo komplikovaniji, jer prvo moram povezati tabele Ulazi/Izlazi sa tabelama Ulazi_data/Izlazi_data da bih pristupio polju ZVANICAN. Dakle moram prvo jedan JOIN da povezem pomenute tabele pa onda jos jedan JOIN da sve to povezem sa tabelom Artikli. Na kraju jos jedan LEFT JOIN da povezem ta dva podupita.
Tako sam dobio dva puta po dva podupita. Jos trebam njih povezat. Opet LEFT JOIN. Povezivanje vrsim preko polja Artikli.ID_Artikal jer se ono pojavljuje u svakom od 4 podupita.
Svaki podupit mi daje jednu agregatnu funkciju (suma kompletno uslih, suma kompletno izaslih, suma nezvanicno uslih i suma nezvanicno izaslih). Njihovim razlikama dobijam ono sto trazim.
E sad, cini mi se da to radi nekako, ali je baza tek testna i nema bez 10-20 zapisa. Ne znam da li ce zbog komplikovanosti to raditi sporo kad se baza napuni. Baza je SQL Server 2000 a programiram u C#.
Jos jedna stvar, na mnogo mjesta dobijam NULL vrijednosti, tamo dje neki artikal nije nikada prodat i sl. ili postoji u tabelama artikli ali nije jos koriscen u ulazima i izlazima. Kako da umjesto NULL tu dobijem broj 0?
Pozdrav...
@priki
kako to mislis FIFO, LIFO i HIFO, ja sam mislio da su to nacini pristupa steku, kakve to veze ima sa bazama, ili ja sam ja nesto dobro propustio??? I sto znaci ovo HIFO, ove prve dvije znam?
[ jablan @ 05.02.2008. 13:39 ] @
Citat: Mikelly: Svaki podupit mi daje jednu agregatnu funkciju (suma kompletno uslih, suma kompletno izaslih, suma nezvanicno uslih i suma nezvanicno izaslih). Njihovim razlikama dobijam ono sto trazim.
Čini mi se da razmišljaš na dobar način (LEFT JOIN), i ja bih na istu foru radio, mada mislim da nisu neophodni podupiti, samo dosta JOIN-ova i GROUP BY. NULL-ovi ne bi trebalo da ti prave problem u agregatnim funkcijama, ako ti baš treba konverzija u nule, koristi ISNULL funkciju ili CASE.
Ako bude problema, okači query pa ćemo ga debagirati. ;)
[ srki @ 05.02.2008. 13:45 ] @
Code: SELECT ID_Artikal,
Sifra_Artikla,
Naziv_Artikla,
COALESCE(ulaz_zvanican,0)-COALESCE(izlaz_zvanican, 0) AS Stanje_ukupno,
COALESCE(ulaz_nezvanican,0)-COALESCE(izlaz_nezvanican, 0) AS Stanje_nezvanicno
FROM Artikli
LEFT JOIN
(SELECT Artikal,
SUM(CASE Zvanican WHEN 1 THEN Kolicina ELSE null END) AS ulaz_zvanican,
SUM(CASE Zvanican WHEN 0 THEN Kolicina ELSE null END) as ulaz_nezvanican
FROM Ulazi, Ulazi_data
WHERE ID=ID_data
GROUP BY Artikal
)
ON ID_Artikal=Artikal
LEFT JOIN
(SELECT Artikal,
SUM(CASE Zvanican WHEN 1 THEN Kolicina ELSE null END) AS izlaz_zvanican,
SUM(CASE Zvanican WHEN 0 THEN Kolicina ELSE null END) as izlaz_nezvanican
FROM Izlazi, Izlazi_data
WHERE ID=ID_data
GROUP BY Artikal
)
ON ID_Artikal=Artikal
Ne vidim nista komplikovano u ovom upitu, sta ti je predstravljalo problem?
[Ovu poruku je menjao srki dana 06.02.2008. u 10:55 GMT+1]
[ priki @ 05.02.2008. 14:43 ] @
to su ti knjigovodstvene metode za ulaz izlaz robe u firmu
a na osnovu kojih se kasnije računa nabavna cena
posto vidim da radis program za ulaz, izlaz robe i fakturisanje
bilo bi ti mnogo lakse da si sve to stavio u jednu tabelu i
da si samo stavio oznaku da li je to ulaz ili izlaz
ili jos bolje, da si taj atribut ulaz izlaz digao na nivo više
a sto se tice nezvanicnih i zvanicnih faktura, to najbolje da si
razdvojio u razlicite tabele sa identičnom strukturom i automatski
bi imao mnogo bolju kontrolu nad podacima
ne bitno, sad kako je tako je
@srki ti je dao jedan dobar odgovor za upit
evo ti jos jedan, ovo sam pisao iz glave
verujem da ces uskladiti prema tvojoj bazi
Code:
declare @stanje TABLE
(
id_artikal int,
Sifra_Artikla NVARCHAR(10),
Naziv_Artikla NVARCHAR(50),
ulazZ NUMERIC(18,4),
ulazNZ NUMERIC(18,4),
IzlazZ NUMERIC(18,4),
IzlazNZ NUMERIC(18,4)
)
INSERT INTO @stanje(id_artikal, sifra_artikla, naziv_Artikla, ulazZ, ulazNZ, izlazN, izlazNZ)
SELECT ID_Artikal, Sifra_Artikla, Naziv_Artikla,
(CASE WHEN Zvanican=1 THEN
ISNULL(SUM(Kolicina), 0.00)
ELSE 0.00
END) AS UlazZ,
(CASE WHEN Zvanican=0 THEN /*ili Zvanican IS NULL */
ISNULL(SUM(Kolicina), 0.0000)
ELSE 0.0000
END) AS UlazNZ, 0.00 IzlazZ, 0.00 IzlazNZ
FROM Artikli art
LEFT JOIN ulazi
LEFT JOIN ulazi_data
WHERE <uslovi>
UNION ALL
SELECT ID_Artikal, Sifra_Artikla, Naziv_Artikla,
0.00 UlazZ, 0.00 UlazNZ,
(CASE WHEN Zvanican=1 THEN
ISNULL(SUM(Kolicina), 0.00)
ELSE 0.00
END) AS IzlazZ,
(CASE WHEN Zvanican=0 THEN /*ili Zvanican IS NULL */
ISNULL(SUM(Kolicina), 0.0000)
ELSE 0.0000
END) AS IzlazNZ
FROM Artikli art
LEFT JOIN izlazi
LEFT JOIN izlazi_data
WHERE <uslovi>
GROUP BY ID_Artikal, Sifra_Artikla, Naziv_Artikla,
i na kraju
Code:
select ID_Artikal, Sifra_Artikla, Naziv_Artikla,
SUM(UlazZ)-SUM(IzlazZ) StanjeZ,
SUM(UlazNZ)-SUM(IzlazNZ) StanjeNZ
FROM @stanje
GROUP BY ID_Artikal, Sifra_Artikla, Naziv_Artikla,
ORDER BY Sifra_Artikla, Naziv_Artikla,
[ Mikelly @ 07.02.2008. 11:34 ] @
@srki
Svaka cast majstore, ovo je tacno to sto mi treba. Nijesam ja jadan zna za ovu COALESCE naredbu, a za CASE sam zna no je nijesam umio ovako iskoristit. Super.
A vidji sto sam ja cinio
Code:
CREATE PROCEDURE Status AS
SELECT
Query1.ID_Artikal, Query1.Naziv_Artikla, Query1.Sifra_Artikla,
Query1.Broj1, Query2.Broj2, Query3.Broj3, Query4.Broj4,
Query1.Broj1 - Query2.Broj2 AS Stanje,
Query3.Broj3 - Query4.Broj4 AS Razlika
FROM
(
(
SELECT Artikli.ID_Artikal, Artikli.Naziv_Artikla, Artikli.Sifra_Artikla, SUM(Ulazi_data.Kolicina) AS Broj1
FROM Artikli
LEFT JOIN Ulazi_data
ON Artikli.ID_Artikal = Ulazi_data.Artikal
GROUP BY Artikli.ID_Artikal, Artikli.Naziv_Artikla, Artikli.Sifra_Artikla
) Query1
LEFT JOIN
(
SELECT Artikli.ID_Artikal, SUM(Izlazi_data.Kolicina) AS Broj2
FROM Artikli
LEFT JOIN Izlazi_data
ON Artikli.ID_Artikal = Izlazi_data.Artikal
GROUP BY Artikli.ID_Artikal
) Query2
ON Query1.ID_Artikal = Query2.ID_Artikal
)
LEFT JOIN
(
(
SELECT Artikli.ID_Artikal, SUM(Ulazi_data.Kolicina) AS Broj3
FROM Artikli
LEFT JOIN Ulazi_data
ON Artikli.ID_Artikal = Ulazi_data.Artikal
LEFT JOIN Ulazi
ON Ulazi.ID_Ulaz = Ulazi_data.Ulaz
GROUP BY Artikli.ID_Artikal, Ulazi.Zvanican
HAVING Ulazi.Zvanican = 0
) Query3
LEFT JOIN
(
SELECT Artikli.ID_Artikal, SUM(Izlazi_data.Kolicina) AS Broj4
FROM Artikli
FULL JOIN Izlazi_data
ON Artikli.ID_Artikal = Izlazi_data.Artikal
FULL JOIN Izlazi
ON Izlazi.ID_Izlaz = Izlazi_data.Izlaz
GROUP BY Artikli.ID_Artikal, Izlazi.Zvanican
HAVING Izlazi.Zvanican = 0
) Query4
ON Query3.ID_Artikal = Query4.ID_Artikal
)
ON Query3.ID_Artikal = Query2.ID_Artikal
Dobijam slicne rezultate kao i ti, ali pazi dje mi je nerjesiv problem bez one COALESCE komande.
Posto idem LEFT JOIN na LEFT JOIN, i tako dva puta, ulaze na izlaze, pa ako mi se desi da nekog artikla nema u ulazima (uzmimo nezvanicne, treci podupit) a ima ga u izlazima (onda takodje nezvanicnim, cetvrti podupit), iako je to po poslovnim pravilima nemoguce, ali ipak, onda se taj artikal nece naci u rezultatu treceg podupita, pa LEFT JOIN nema sa cime da spoji artikal koji mozda postoji u cetvrtom podupitu, i u konacnom rezultatu dobijam recimo:
31--24--NULL--NULL
a tvoj upit daje, recimo
31--24--0--7.
Jos jednom, svaka cast, mozda tebi nije bilo tesko, ali je meni bas pomoglo.
[ srki @ 07.02.2008. 11:52 ] @
Sada vidim iz tvog upita da ne treba posebno zvanicni i nezvanicni ulazi nego ukupni i nezvanicni. Nista, samo promeni u mom upitu Code: COALESCE(ulaz_zvanican,0)-COALESCE(izlaz_zvanican, 0) AS Stanje_ukupno
u
Code: COALESCE(ulaz_zvanican,0)+COALESCE(ulaz_nezvanican,0)-COALESCE(izlaz_zvanican, 0)-COALESCE(izlaz_nezvanican, 0) AS Stanje_ukupno
Pozdrav
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|