Centar za edukaciju-BiH



#1 17.12.2012 09:58
xl_kid Van mreze
Clan
Registrovan od:11.11.2008
Postovi:154


Predmet:Pomoć oko upita
Skidam podatke sa servera i imam jedan upit oko koga mi je potrebna pomoć. Kontrole radi, proveravam da li su za sve otpremnice uradjeni računi. Dole je upit kojim to proveravam u bazi. Ako je količina na otpremnici nula onda nije potreban račun ali ako je veća od nule račun nije uradjen. Moje pitanje je kako da mi prikaže podatke ako je suma veća od nule odnosno u mom primeru "skolicina is not null ili skolicina > 0"

SELECT m.id_dokumenta, m.id_vd, sum(d.kolicina_promener) over (PARTITION BY d.id_dokumenta) as skolicina, m.poslovni_partner#_kd, m.poslovni_partner#_pk,
m.organizaciona_jedinica#_real, m.poslovni_partner#_ot, m.godina, m.datum_isporuke, m.id_relacije, p.id_dokumenta, p.id_fin_dokumenta
FROM (uz_dokument m LEFT OUTER JOIN prod_fakturisan_dokument p ON m.id_dokumenta = p.id_dokumenta) LEFT OUTER JOIN UZ_DOKUMENT_STAVKA d ON d.id_dokumenta = m.id_dokumenta
where m.godina ='2012'
and m.id_vd in (19, 354)
and m.organizaciona_jedinica#_real = '501'
and p.id_fin_dokumenta IS NULL
and m.poslovni_partner#_kd <>'14690'
and m.broj_poslednje_stavke IS NOT NULL
and m.datum_isporuke between to_date(:p_datum_od,'dd.mm.rrrr') and to_date(:p_datum_do,'dd.mm.rrrr')
order by m.datum_isporuke ASC
↑  ↓

#2 17.12.2012 19:13
zidar Van mreze
Moderator
Registrovan od:03.02.2009
Postovi:27


Predmet:Re: Pomoć oko upita
skolicina ti je ono sto racunas sa Sum(d.kolicina_promener) OVER (PARTITION BY d.id_dokumenta), pa bi trebalo staviti u WHERE nesto ovako:

Sum(d.kolicina_promener) OVER (PARTITION BY d.id_dokumenta) >0 OR Sum(d.kolicina_promener) OVER (PARTITION BY d.id_dokumenta) IS NOT NULL

Medjutim, window funkcije (none sa OVER()) ne mogu da se stave u WHERE, sintaksa za T-SQL to ne dozvoljabva. Za ono sto tebi treba potrebna su dva koraka
- prvo izracunas skolicina (sto si i uradio)
- u sledecem koraku izvuces rekorde koji ti trebaju

Ovako nekako:

Citat:
WITH Proracun As
(
SELECT
    m.id_dokumenta
    , m.id_vd
    , Sum(d.kolicina_promener) OVER (PARTITION BY d.id_dokumenta) AS skolicina
    , m.poslovni_partner#_kd
    , m.poslovni_partner#_pk
    , m.organizaciona_jedinica#_real
    , m.poslovni_partner#_ot
    , m.godina
    , m.datum_isporuke
    , m.id_relacije
    , p.id_dokumenta
    , p.id_fin_dokumenta
FROM uz_DokuMent m
LEFT OUTER JOIN Prod_fakturIsAn_DokuMent p ON m.id_dokumenta = p.id_dokumenta)
LEFT OUTER JOIN uz_DokuMent_stavka d ON d.id_dokumenta = m.id_dokumenta
WHERE m.godina = '2012'
                        AND m.id_vd IN ( 19, 354 )
                        AND m.organizaciona_jedinica#_real = '501'
                        AND p.id_fin_dokumenta IS NULL
                        AND m.poslovni_partner#_kd <> '14690'
                        AND m.broj_poslednje_stavke IS NOT NULL
                        AND m.datum_isporuke BETWEEN To_date(:p_datum_od, 'dd.mm.rrrr') AND To_date(:p_datum_do, 'dd.mm.rrrr')
--ORDER BY m.datum_isporuke ASC
)
SELECT
*
FROM Proracun
WHERE skolicina IS NOT NULL OR skolicina > 0
ORDER BY m.datum_isporuke ASC
;
↑  ↓

#3 20.12.2012 07:23
xl_kid Van mreze
Clan
Registrovan od:11.11.2008
Postovi:154


Predmet:Re: Pomoć oko upita
Tek sada sam proverio. JAvlja mi grešku kod ORDER BY
SELECT
*
FROM Proracun
WHERE skolicina IS NOT NULL OR skolicina > 0
ORDER BY m.datum_isporuke ASC
↑  ↓

#4 21.12.2012 16:58
zidar Van mreze
Moderator
Registrovan od:03.02.2009
Postovi:27


Predmet:Re: Pomoć oko upita
Smeta ti ono m. u m.datum_isporuke, ili dodaj m u FROM ili izbaci iz m.datum isporuke:

SELECT
*
FROM Proracun AS M
WHERE skolicina IS NOT NULL OR skolicina > 0
ORDER BY m.datum_isporuke ASC
↑  ↓

#5 25.12.2012 10:02
xl_kid Van mreze
Clan
Registrovan od:11.11.2008
Postovi:154


Predmet:Re: Pomoć oko upita
Javlja mi sada grešku na select

WITH Proracun As
(
SELECT
m.id_dokumenta
, m.id_vd
, Sum(d.kolicina_promener) OVER (PARTITION BY d.id_dokumenta) AS skolicina
, m.poslovni_partner#_kd
, m.poslovni_partner#_pk
, m.organizaciona_jedinica#_real
, m.poslovni_partner#_ot
, m.godina
, m.datum_isporuke
, m.id_relacije
, p.id_dokumenta
, p.id_fin_dokumenta
FROM uz_dokument m
LEFT OUTER JOIN prod_fakturisan_dokument p ON m.id_dokumenta = p.id_dokumenta
LEFT OUTER JOIN uz_dokument_stavka d ON d.id_dokumenta = m.id_dokumenta
WHERE m.godina = '2012'
AND m.id_vd IN ( 19, 354 )
AND m.organizaciona_jedinica#_real = '501'
AND p.id_fin_dokumenta IS NULL
AND m.poslovni_partner#_kd <> '14690'
AND m.broj_poslednje_stavke IS NOT NULL
AND m.datum_isporuke BETWEEN To_date(:p_datum_od, 'dd.mm.rrrr') AND To_date(:p_datum_do, 'dd.mm.rrrr')
)
SELECT
* --ovde mi javlja grešku
FROM Proracun
WHERE skolicina IS NOT NULL OR skolicina > 0
ORDER BY datum_isporuke ASC
;
↑  ↓

#6 03.01.2013 16:26
zidar Van mreze
Moderator
Registrovan od:03.02.2009
Postovi:27


Predmet:Re: Pomoć oko upita
Meni izgleda da je greska u WITH delu. Proveri prvo da li ti radi ono untar WITH.
Radim sa verzijom 2005, pa ne preopzanjem sve funkcije koje si upotrebio, ali mi izgleda da nesto nije u redu u izrazu:

AND m.datum_isporuke BETWEEN To_date(:p_datum_od, 'dd.mm.rrrr') AND To_date(:p_datum_do, 'dd.mm.rrrr')[size=extended][/size]

Ono 'dd.mm.rrrr', da li tu treba neki stvarni podatak, kao '25.09.2012'?
↑  ↓

#7 03.01.2013 16:46
zidar Van mreze
Moderator
Registrovan od:03.02.2009
Postovi:27


Predmet:Re: Pomoć oko upita
U stvari, ceo upit moze da se napise malo razgovetnije, po delovima pa ce se greska lakse pronaci:
[sql]
; WITH OtpremniceSaKolicinomVecomOdNule AS
(
-- ovde se listaju samo one otpremnice koje imaju stavke
-- i ukupna kolicina svih stavki je veca od nule
SELECT id_dokumenta, Kolicina = SUM(kolicina_promenenr)
FROM UZ_dokument_Stavka
HAVING SUM(kolicina_promenenr)>0
)
, OtpremniceZaKojeTrebaRacun AS
(
-- Za otpremnice koje imaju stavke i kolicine vece od nule
-- dodajemo ostale podatke iz tabele uz_DokuMent
SELECT
m.id_dokumenta
, m.id_vd
, m.poslovni_partner#_kd
, m.poslovni_partner#_pk
, m.organizaciona_jedinica#_real
, m.poslovni_partner#_ot
, m.godina
, m.datum_isporuke
, m.id_relacije
, v.Kolicina
FROM uz_DokuMent AS m
JOIN OtpremniceSaKolicinomVecomOdNule AS V ON V.id_dokumenta = m.id_dokumenta
)
-- Otpremnice bez racuna:
-- OtpremniceZaKojeTrebaRacun a koje nemamo u Prod_fakturIsAn_DokuMent
SELECT
m.*
FROM OtpremniceZaKojeTrebaRacun AS m
LEFT JOIN Prod_fakturIsAn_DokuMent p ON m.id_dokumenta = p.id_dokumenta
WHERE p.id_dokumenta IS NULL
;
[\sql]

Prvi segment u WITH, pronalazi one otpremnice koje imaju neke kolicine, direktno iz tabele Stavke.
U drugom segmentu dodajemo opis otpremnice, iz tabele otpremnice. Na kraju, drugi segment poredimo sa tebelom Fakture. To je logika. WHERE uslove treba dodati sto ranije, u prvi ili drugi segmet.

Prvi segment se moze napisati malo slozenije, JOIN sa Otpremnice, pa se tu doda WHERE datumOtpremnice BETWEEN...

Usput, na koji nacin da ubacim SQL text u poruku, i da izgleda kao SQL? Probao sam sa .., ali to nije to, dodaje mi brojeve linija.
↑  ↓

Stranice (1):1


Sva vremena su GMT +01:00. Trenutno vrijeme: 7: 43 am.