Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Komplikovan sql upit, molim pomoć

[es] :: Baze podataka :: Komplikovan sql upit, molim pomoć

[ Pregleda: 2737 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Mikelly

Član broj: 16730
Poruke: 389
212.200.246.*



Profil

icon Komplikovan sql upit, molim pomoć04.02.2008. u 11:30 - pre 197 meseci
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
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
91.102.226.*

Sajt: www.baze-podataka.net


+4 Profil

icon Re: Komplikovan sql upit, molim pomoć04.02.2008. u 12:13 - pre 197 meseci
Pogledaj top temu o pravilima foruma baza podataka. Tamo je pod 3 navedeno kako da postavis pitanje vezano za SQL upit.
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

priki

Član broj: 24732
Poruke: 700
*.static.t-2.net.

ICQ: 174153511


+26 Profil

icon Re: Komplikovan sql upit, molim pomoć05.02.2008. u 07:53 - pre 197 meseci
i objasni po kojoj metodi radis ulaze tj izlaze
fifo, lifo, hifo ili kako ?
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
*.crnagora.net.



Profil

icon Re: Komplikovan sql upit, molim pomoć05.02.2008. u 13:18 - pre 197 meseci
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?


 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Komplikovan sql upit, molim pomoć05.02.2008. u 13:39 - pre 197 meseci
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. ;)
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.xdsl.xnet.co.nz.



+3 Profil

icon Re: Komplikovan sql upit, molim pomoć05.02.2008. u 13:45 - pre 197 meseci
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]
 
Odgovor na temu

priki

Član broj: 24732
Poruke: 700
*.static.t-2.net.

ICQ: 174153511


+26 Profil

icon Re: Komplikovan sql upit, molim pomoć05.02.2008. u 14:43 - pre 197 meseci
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,
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
*.crnagora.net.



Profil

icon Re: Komplikovan sql upit, molim pomoć07.02.2008. u 11:34 - pre 197 meseci
@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.
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.xdsl.xnet.co.nz.



+3 Profil

icon Re: Komplikovan sql upit, molim pomoć07.02.2008. u 11:52 - pre 197 meseci
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
 
Odgovor na temu

[es] :: Baze podataka :: Komplikovan sql upit, molim pomoć

[ Pregleda: 2737 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.