xl_kid 25.12.2012 10:02
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
;

xl_kid 17.12.2012 09:58
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

zidar 17.12.2012 19:13
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
;

xl_kid 20.12.2012 07:23
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

zidar 21.12.2012 16:58
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

zidar 03.01.2013 16:26
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'?

zidar 03.01.2013 16:46
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.