www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

SQL vprašanje
Pojdi na stran Prejšnja  1, 2
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programska oprema
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
clownfish
Član
Član



Pridružen-a: Pet 05 Avg 2005 13:05
Prispevkov: 766
Aktiv.: 3.22
Kraj: Povir / Ljubljana

PrispevekObjavljeno: Pet Sep 26, 2014 9:09 am    Naslov sporočila:   Odgovori s citatom

danilo je napisal/a:
Poglej si še kako združiš dve tabeli v eno z join ukazom. Za razlago glej select stavek.

lp Danilo


V osnovi so vsi podatki že v isti tabeli. Z dvema selectoma sem jih samo izbral ven iz iste tabele.
Še vedno pa mi ni jasno kako grem z dvema kazalcema po isti tabeli in izdaje odštevam od prevzemov?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 3.04
Kraj: Ljubljana

PrispevekObjavljeno: Pet Sep 26, 2014 12:40 pm    Naslov sporočila:   Odgovori s citatom

Če sem te dobro razumel bi rad imel running balance?

Koda:

artikel, datum, delta, stanje
čebula,010114,+123,123
čebula,020114,-100,23
čebula,030114,+321,344
čebula,040114,-100,244


Koda:

SELECT a.artikel, a.datum, a.delta, (SELECT SUM(b.delta)
                       FROM artikli b
                       WHERE b.datum <= a.datum)
FROM   artikli a
ORDER BY a.artikel, a.datum;


oziroma nekaj takega

Koda:

SELECT a.artikel, a.datum, a.delta,
(SELECT SUM(prevzemi.delta) FROM artikli AS prevzemi WHERE prevzemi.datum <= a.datum) -
(SELECT SUM(izdaje.delta) FROM artikli AS izdaje WHERE izdaje.datum <= a.datum)
AS delta
FROM   artikli a
ORDER BY a.artikel, a.datum;


Pazi pa da daš v pogoj tudi "id" oziroma nekjaj unikatnega po čemer boš sortiral!
Sicer bodo imeli vsi atrikli z istim imenom, datumom, ... enako stanje!

lp, gregor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
clownfish
Član
Član



Pridružen-a: Pet 05 Avg 2005 13:05
Prispevkov: 766
Aktiv.: 3.22
Kraj: Povir / Ljubljana

PrispevekObjavljeno: Pet Sep 26, 2014 12:58 pm    Naslov sporočila:   Odgovori s citatom

gregoral je napisal/a:
Če sem te dobro razumel bi rad imel running balance?


"running balance" si moram pogledati kaj to sploh pomeni



Ja vse je v isti tabeli tako prevzemi kot izdaje.
Vendar ima lahko vsak prevzem svojo prevzemno ceno.
Tako moram za vsako izdajo blaga izračunati oz dobiti podatek iz katerih prevzemov je bila količina izdana po FIFO.
Tako se potem lahko zgodi, da je neka količina na neki idaji izdana iz dveh ali več prevzemov torej z različnimi prevzemnimi cenami.
In ta podatek iz katerih prevzemov po kateri prevzeni ceni potrebujem da potem lahko izračunam kolikšna je bila skupna nabavna cena in preko tega RVC oz razlika v ceni do proedajne cene oz zaslužek.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
clownfish
Član
Član



Pridružen-a: Pet 05 Avg 2005 13:05
Prispevkov: 766
Aktiv.: 3.22
Kraj: Povir / Ljubljana

PrispevekObjavljeno: Pet Sep 26, 2014 4:37 pm    Naslov sporočila:   Odgovori s citatom

Ker zaloga nikoli ne gre pod nič in je preva izdaja manjša ali enaka začetnemu stanju oz prevzemu potem bi moral narediti SQL stavek takole:


Vzeti moram prvi prevzem - njegovo številko in količino
ter jo vpisat v novo tabelo nova_izdaja z podatki trenutne izdaje.
Hkrati v tabeli prevzemov od količine tega prevzema odšteti izdano količino.

nato pa kreirati zanko ki bi:

zanka:
Nadaljujem na naslednjo izdajo
preberem količino izdaje in jo odštejem od preostale količine na temu prevzemu

Če je razlika > 0
v tabelo nova_izdaja vpišem to izdajo in prevzem - njegovo številko in količino
izdaje.
nadaljujem na naslednji zapis v tabeli izdaj

Če je razlika = 0 v novo tabelo nova_izdaja vpišem to izdajo z preostalo
količino od trenutnega prevzema.
Ter vzamem naslednji prevzem.

Če je razlika < 0 v novo tabelo nova_izdaja vpišem to izdajo z preostalo
količino od trenutnega prevzema.
Ter vzamem naslednji prevzem njegovo številko in količino in spet izračunam
razliko med preostalo izdajo in novim prevzemom.
Ter to zapišem v novo tabelo nova_izdaja


ponovi zanko do konca zapisov v tabeli izdaj


čisto enostavno Smile Sedaj moram le to "razmišljanje" prelevit v SQL stavke Sad
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 3.04
Kraj: Ljubljana

PrispevekObjavljeno: Sob Sep 27, 2014 1:37 am    Naslov sporočila:   Odgovori s citatom

@clownfish
Tole je po mojem mnenju čist preveč zakomplicirano za na forum ( tako kot si napisal ).

1) naredi si čisto enostavne primere ( par vrstic: prevzem, izdaja, izdaja ) z enostavnimi količinami in cenami
2) na teh primerih prikaži kaj bi rad izračunal
3) potem boš morda dobil kak pameten sql stavek

Koda:

artikel, +2, 10.00€
artikel, +4, 12.00€
artikel, -1, 10.00€
artikel, -2, 11.00€
artikel, -1, 12.00€


Zdaj če sem te razumel te zanima kako izračunat tehle 10€, 11€ in 12€ pri izdajah?
Ali sem prikazal prave številke za ceno pir izdajah?
lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
clownfish
Član
Član



Pridružen-a: Pet 05 Avg 2005 13:05
Prispevkov: 766
Aktiv.: 3.22
Kraj: Povir / Ljubljana

PrispevekObjavljeno: Ned Sep 28, 2014 10:44 pm    Naslov sporočila:   Odgovori s citatom

Hmm saj sem dal primer z podatki v začetnih tabelah in kaj bi na koncu želel..
Kot sem že zapisal.
Artikel z prevzemom prevzamemo po neki ceni in količini.
Potem to z izdajami iz skladišča izdajamo z neko količino. Vmes dobimo še drug tretji prevzem po drugačnih cenah in tako naprej.

Na koncu bi želel, da obdelava "porablja" količine iz starih prevzemov in če tega ni zadosti vzame iz naslednjega prevzema in tako do konca.

Zato mora obdelava vzeti količino iz prvega prevzema ter na izdaje dodajti številko tega prevzema in prevzemno ceno dokler je razlika med skupno izdano količino in količino prevzema večja od nič.
Ko je manjša od nič razdeli to izdajo kar je še ostalo iz začetnega prevzema v ta prevzem in preostanek v naslendji prevzem.. in tako do konca..

In tako je tudi prikazano z zadnji tabeli tak rezultat bi želel.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 3.04
Kraj: Ljubljana

PrispevekObjavljeno: Pon Sep 29, 2014 7:42 pm    Naslov sporočila:   Odgovori s citatom

@clownfish:
Glej nimam časa da se bom poglabljal v primer ki ima veliko podtkov.
Če ne moreš prikazat na največ 5 vrsticah in 3 stolpcih, potem je zadeva prekompleksna za na forum.

Razen če se te bo kdo usmilil in si vzel za poglobitev v tvoj problem veliko časa.

Glej kot opis si dal ( med drugim ) tudi tole:
clownfish je napisal/a:
Ker zaloga nikoli ne gre pod nič in je preva izdaja manjša ali enaka začetnemu stanju oz prevzemu potem bi moral narediti SQL stavek takole:


Vzeti moram prvi prevzem - njegovo številko in količino
ter jo vpisat v novo tabelo nova_izdaja z podatki trenutne izdaje.
Hkrati v tabeli prevzemov od količine tega prevzema odšteti izdano količino.

nato pa kreirati zanko ki bi:

zanka:
Nadaljujem na naslednjo izdajo
preberem količino izdaje in jo odštejem od preostale količine na temu prevzemu

Če je razlika > 0
v tabelo nova_izdaja vpišem to izdajo in prevzem - njegovo številko in količino
izdaje.
nadaljujem na naslednji zapis v tabeli izdaj

Če je razlika = 0 v novo tabelo nova_izdaja vpišem to izdajo z preostalo
količino od trenutnega prevzema.
Ter vzamem naslednji prevzem.

Če je razlika < 0 v novo tabelo nova_izdaja vpišem to izdajo z preostalo
količino od trenutnega prevzema.
Ter vzamem naslednji prevzem njegovo številko in količino in spet izračunam
razliko med preostalo izdajo in novim prevzemom.
Ter to zapišem v novo tabelo nova_izdaja


ponovi zanko do konca zapisov v tabeli izdaj


čisto enostavno Smile Sedaj moram le to "razmišljanje" prelevit v SQL stavke Sad


Se ti ne zdi da je to čisto preveč kompleksno za brezplačno pomoč na forumu?

Kmalu bodo glede tvojega "vprašanja za 5 minut" polne dve strani postov.

POENOSTAVI!

lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
clownfish
Član
Član



Pridružen-a: Pet 05 Avg 2005 13:05
Prispevkov: 766
Aktiv.: 3.22
Kraj: Povir / Ljubljana

PrispevekObjavljeno: Tor Sep 30, 2014 8:33 am    Naslov sporočila:   Odgovori s citatom

Pozdravljen gregoral !

Zahvalil bi se ti za spodbudne besede ter svojo interpretacijo mojega problema.
na forum sem se obrnil zato ker sem mnenja da je moje vprašanje dokaj enostavno vendar ga sam z svojim trenuitnim zannjem SQL-a ne znam razrešiti.

Prav tako nisem napisal, da je to "vprašanje za 5 minut" vsekakor pa je moj problem za nekega poznavalca SQL-a verjetno tako enostaven, da se ob samem vprašanju samo nasmeje in samo izvajanje SQL stavkov na hitro ob jutranji kavici spiše v par vrstic kode.

Glede tvoje pripombe glede kompleksnosti prav tako lahko povem, da to ni vprašanje za ne vem kakšne eksperte SQL-a in zagotovo je na forumu kar nekaj takšnih poznavalcev, ki bi pri temu znali konstruktivno pomagati.

Sem namreč mnenja, da je v našem domačem okolju predvsem pa na temu forumu veliko zelo perspektivnih in znanja polnih pametnih uporabnikov kar se kaže tudi v samih projektih, ki so in še tečejo.

Pri razlagi svojega SQL problema pa sem prav tako podal obe začetni ter vmestno in končno tabelo kakršno želim dobiti. Žal se to v 3 stolpcih in 5 vrsticah ne da podati zato je zraven tudi opis tega kar želim da SQL stavek "dela".
In mislim, da sem izbral pravi in primeren pristop k obrazložitvi mojega problema.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Tor Sep 30, 2014 10:00 am    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
clownfish
Član
Član



Pridružen-a: Pet 05 Avg 2005 13:05
Prispevkov: 766
Aktiv.: 3.22
Kraj: Povir / Ljubljana

PrispevekObjavljeno: Tor Sep 30, 2014 10:18 am    Naslov sporočila:   Odgovori s citatom

Za obdelavo in prikaz rezultatov uporabljam programsko orodje QlikView.

Sistem omogoča read only priklop na bazo iz katerih preberem podatke v interne tabele na katerih pa potem lahko delam "kar želim" ter na koncu podatke tudi prikažem v obliki tabel ali grafov.
Vseeno po branju teh podatkov iz baze v obliki, ki so prikazani že v prejšnjih tabelah moram te podatke primerno obdelati, da dobim na koncu obliko, ki vsebuje željene podatke.
Sam script ki naredi to obdelavo pa vsebuje SQL obdelavo, ki te dve tabeli na pravilen način združi ter naredi update tabele izdaj ali pa kreira novo tretjo tabelo.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
bpavsic
Član
Član



Pridružen-a: Pet 03 Apr 2009 20:45
Prispevkov: 354
Aktiv.: 1.79
Kraj: Maribor

PrispevekObjavljeno: Tor Sep 30, 2014 11:43 am    Naslov sporočila:   Odgovori s citatom

Sicer nimam izkušenj na področju MS SQL serverja, sem pa tvojo zadevo naredil v Oracleu.. Da vsaj vidiš v čem je finta...

Kreiranje vhodnih tabel s podatki:
Koda:

CREATE TABLE PREVZEM
(
  DATUM DATE
, ARTIKEL VARCHAR2(20 CHAR)
, PREVZEM VARCHAR2(20 CHAR)
, KOLICINA NUMBER(18, 4)
, CENA NUMBER(18, 4)
, STATUS VARCHAR2(20 CHAR)
);

CREATE TABLE IZDAJA
(
  DATUM DATE
, ARTIKEL VARCHAR2(20 CHAR)
, IZDAJA VARCHAR2(20 CHAR)
, KOLICINA NUMBER(18, 4)
);

INSERT INTO PREVZEM (DATUM, ARTIKEL, PREVZEM, KOLICINA, CENA, STATUS) VALUES (TO_DATE('20121204', 'YYYYMMDD'), '930826', 'PR00000', 12, 10, 'ZacStanje');
INSERT INTO PREVZEM (DATUM, ARTIKEL, PREVZEM, KOLICINA, CENA, STATUS) VALUES (TO_DATE('20121205', 'YYYYMMDD'), '930826', 'PR00131', 5, 12, 'Prevzem');
INSERT INTO PREVZEM (DATUM, ARTIKEL, PREVZEM, KOLICINA, CENA, STATUS) VALUES (TO_DATE('20130627', 'YYYYMMDD'), '930826', 'PR00174', 10, 14, 'Prevzem');
INSERT INTO PREVZEM (DATUM, ARTIKEL, PREVZEM, KOLICINA, CENA, STATUS) VALUES (TO_DATE('20130910', 'YYYYMMDD'), '930826', 'PR00193', 13, 18, 'Prevzem');
INSERT INTO PREVZEM (DATUM, ARTIKEL, PREVZEM, KOLICINA, CENA, STATUS) VALUES (TO_DATE('20131023', 'YYYYMMDD'), '930826', 'PR00231', 6, 10, 'Prevzem');
INSERT INTO PREVZEM (DATUM, ARTIKEL, PREVZEM, KOLICINA, CENA, STATUS) VALUES (TO_DATE('20140116', 'YYYYMMDD'), '930826', 'PR00452', 4, 16, 'Prevzem');

INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20121207', 'YYYYMMDD'), '930826', 'IZD00213', -2);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20121207', 'YYYYMMDD'), '930826', 'IZD00214', -3);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20130103', 'YYYYMMDD'), '930826', 'IZD00215', -1);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20130110', 'YYYYMMDD'), '930826', 'IZD00216', -1);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20130123', 'YYYYMMDD'), '930826', 'IZD00217', -3);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20130306', 'YYYYMMDD'), '930826', 'IZD00218', -1);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20130508', 'YYYYMMDD'), '930826', 'IZD00219', -3);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20130603', 'YYYYMMDD'), '930826', 'IZD00220', -1);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20130708', 'YYYYMMDD'), '930826', 'IZD00221', -2);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20130727', 'YYYYMMDD'), '930826', 'IZD00222', -3);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20130801', 'YYYYMMDD'), '930826', 'IZD00223', -2);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20130816', 'YYYYMMDD'), '930826', 'IZD00224', -3);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20130904', 'YYYYMMDD'), '930826', 'IZD00225', -1);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20130905', 'YYYYMMDD'), '930826', 'IZD00226', -1);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20130918', 'YYYYMMDD'), '930826', 'IZD00227', -1);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20131008', 'YYYYMMDD'), '930826', 'IZD00228', -1);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20131008', 'YYYYMMDD'), '930826', 'IZD00229', -2);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20131011', 'YYYYMMDD'), '930826', 'IZD00230', -3);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20131015', 'YYYYMMDD'), '930826', 'IZD00231', -4);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20131016', 'YYYYMMDD'), '930826', 'IZD00232', -2);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20131029', 'YYYYMMDD'), '930826', 'IZD00233', -2);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20131107', 'YYYYMMDD'), '930826', 'IZD00234', -1);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20131116', 'YYYYMMDD'), '930826', 'IZD00235', -1);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20140109', 'YYYYMMDD'), '930826', 'IZD00236', -1);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20140128', 'YYYYMMDD'), '930826', 'IZD00237', -1);
INSERT INTO IZDAJA (datum, artikel, izdaja, kolicina) VALUES (TO_DATE('20140128', 'YYYYMMDD'), '930826', 'IZD00238', -1);


Select, ki združi obe tabeli in vrne rezultat:
Koda:

select To_char(iz_datum, 'yyyymmdd') datum, iz_artikel artikel, iz_naziv izdaja, kolicina, pr_naziv prevzem, pr_cena cena from (
select case when prevzem.sumkolicin - prevzem.kolicina <= -(izdaja.sumkolicin - izdaja.kolicina) and prevzem.sumkolicin >= -izdaja.sumkolicin then izdaja.kolicina
            when prevzem.sumkolicin - prevzem.kolicina <= -(izdaja.sumkolicin - izdaja.kolicina) then -(prevzem.sumkolicin + izdaja.sumkolicin - izdaja.kolicina)
            when prevzem.sumkolicin - prevzem.kolicina >= -(izdaja.sumkolicin - izdaja.kolicina) and prevzem.sumkolicin <= -izdaja.sumkolicin then -prevzem.kolicina
            else izdaja.sumkolicin + prevzem.sumkolicin - prevzem.kolicina end kolicina,
       izdaja.datum iz_datum, izdaja.izdaja iz_naziv, izdaja.kolicina iz_kolicina, izdaja.sumkolicin - izdaja.kolicina iz_stanje_pred, izdaja.sumkolicin iz_stanje_po, izdaja.artikel iz_artikel,
       prevzem.datum pr_datum, prevzem.prevzem pr_naziv, prevzem.kolicina pr_kolicina, prevzem.sumkolicin - prevzem.kolicina pr_stanje_pred, prevzem.sumkolicin pr_stanje_po, prevzem.status pr_status, prevzem.cena pr_cena from
(select datum, artikel, izdaja, kolicina, SUM(kolicina) OVER (ORDER BY artikel, datum ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) sumkolicin from izdaja) izdaja,
(select datum, artikel, prevzem, kolicina, cena, status, SUM(kolicina) OVER (ORDER BY artikel, datum ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) sumkolicin from prevzem) prevzem
where izdaja.artikel = prevzem.artikel and prevzem.sumkolicin > -(izdaja.sumkolicin - izdaja.kolicina)
 and prevzem.sumkolicin - prevzem.kolicina < -izdaja.sumkolicin
order by izdaja.artikel, izdaja.datum, izdaja.sumkolicin desc, prevzem.sumkolicin)


Rezultat:
Koda:

"DATUM"   "ARTIKEL"   "IZDAJA"   "KOLICINA"   "PREVZEM"   "CENA"
"20121207"   "930826"   "IZD00213"   -2   "PR00000"   10
"20121207"   "930826"   "IZD00214"   -3   "PR00000"   10
"20130103"   "930826"   "IZD00215"   -1   "PR00000"   10
"20130110"   "930826"   "IZD00216"   -1   "PR00000"   10
"20130123"   "930826"   "IZD00217"   -3   "PR00000"   10
"20130306"   "930826"   "IZD00218"   -1   "PR00000"   10
"20130508"   "930826"   "IZD00219"   -1   "PR00000"   10
"20130508"   "930826"   "IZD00219"   -2   "PR00131"   12
"20130603"   "930826"   "IZD00220"   -1   "PR00131"   12
"20130708"   "930826"   "IZD00221"   -2   "PR00131"   12
"20130727"   "930826"   "IZD00222"   -3   "PR00174"   14
"20130801"   "930826"   "IZD00223"   -2   "PR00174"   14
"20130816"   "930826"   "IZD00224"   -3   "PR00174"   14
"20130904"   "930826"   "IZD00225"   -1   "PR00174"   14
"20130905"   "930826"   "IZD00226"   -1   "PR00174"   14
"20130918"   "930826"   "IZD00227"   -1   "PR00193"   18
"20131008"   "930826"   "IZD00228"   -1   "PR00193"   18
"20131008"   "930826"   "IZD00229"   -2   "PR00193"   18
"20131011"   "930826"   "IZD00230"   -3   "PR00193"   18
"20131015"   "930826"   "IZD00231"   -4   "PR00193"   18
"20131016"   "930826"   "IZD00232"   -2   "PR00193"   18
"20131029"   "930826"   "IZD00233"   -2   "PR00231"   10
"20131107"   "930826"   "IZD00234"   -1   "PR00231"   10
"20131116"   "930826"   "IZD00235"   -1   "PR00231"   10
"20140109"   "930826"   "IZD00236"   -1   "PR00231"   10
"20140128"   "930826"   "IZD00237"   -1   "PR00231"   10
"20140128"   "930826"   "IZD00238"   -1   "PR00452"   16
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
bpavsic
Član
Član



Pridružen-a: Pet 03 Apr 2009 20:45
Prispevkov: 354
Aktiv.: 1.79
Kraj: Maribor

PrispevekObjavljeno: Tor Sep 30, 2014 11:51 am    Naslov sporočila:   Odgovori s citatom

Pa da še malo komentiram logiko za SQLom:

- osnova sta 2 selecta na sredini (izdaja in prevzem), ki imata dodano polje "sumkolicin", kar je v bistvu "running balance", na kar te je že opozoril gregoral
- ta dva selecta sedaj kartezično združimo (vsak prejem z vsako izdajo) in odstranimo tiste, kjer se ne ujema artikel (lahko bi se dodal še datum, npr. prevzem.datum < izdaja.datum) ter tiste, kjer je stanje zaloge pred in po prejemu/izdaji za nas neveljavno (torej npr. zaloga po prejemu < zaloge pred izdajo ali pa zaloga pred prejemom > zaloge po izdaji)
- nato s case-om še izračunom delež izdaje znotraj vsakega prejema, ki je ostal v paru z izdajo.

V grobem je to to...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
clownfish
Član
Član



Pridružen-a: Pet 05 Avg 2005 13:05
Prispevkov: 766
Aktiv.: 3.22
Kraj: Povir / Ljubljana

PrispevekObjavljeno: Tor Sep 30, 2014 12:18 pm    Naslov sporočila:   Odgovori s citatom

bpavsic

HVALA za nazoren prikaz in "rešitev" mojega problema.

Sam SQL si bom pogledal in ga poizkusil tudi razumeti čeprav že sedaj lahko komentiram da to precej presega moje trenutno SQL znanje.

Sedaj moram to samo že prekonvertirati v QlikView script obliko pa bo Smile

Še enkrat HVALA!!!


Nazadnje urejal/a clownfish Tor Sep 30, 2014 12:33 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Tor Sep 30, 2014 12:32 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
bpavsic
Član
Član



Pridružen-a: Pet 03 Apr 2009 20:45
Prispevkov: 354
Aktiv.: 1.79
Kraj: Maribor

PrispevekObjavljeno: Tor Sep 30, 2014 12:37 pm    Naslov sporočila:   Odgovori s citatom

Upam, da ti bo šlo. Lahko, da so razlike med Oracleom in MS SQL serverjem (že joini so npr. drugačni). Ampak to ni tako bistveno.
Bistveno je, da razumeš, zakaj stvar tako dela, kot dela in si potem prepišeš SQL stavek v tako obliko, da ga bo MS SQL razumel.
Tudi sam sem tega selecta lotil po delih. Najprej notranja selecta s stanjem zaloge. Ko ti ta 2 delata tako kot treba, nadaljuješ, si povežeš oba in začneš odstranjevati pare (recorde), ki niso relevantni za tvoj izhod. Ko ti select vrne pravilne kombinacije izdaj in prevzemov v pravilnem vrstnem redu, pa se začneš ukvarjat z izračunom količine, ki gre iz vsakega prejema na izdajo.

Aja, mogoče še bo treba kak Group By zaradi artiklov, predvsem tam v notranjih selectih, ko si izračunava zalogo (da ne bi zaloga bila skupna za vse artikle Very Happy)

edit:

Glede OVER-ja... Gregoral je že zgoraj napisal drugačno rešitev za izračun zaloge, tako da če to ne bo delovalo, uporabi tisto.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programska oprema Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2
Stran 2 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 9 dni


Powered by phpBB © 2001, 2005 phpBB Group