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

Slozeni upit pomoc

[es] :: MS SQL :: Slozeni upit pomoc

[ Pregleda: 4998 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Slozeni upit pomoc09.03.2013. u 11:02 - pre 134 meseci
Potrebna mi je pomoć u vezi složenog upita. Nemam puno iskustva sa tim pa ne znam ni u kom pravcu da razmisljam.

Code:

SELECT FinansijskaKartica.Konto, FinansijskaKartica.SifKomint, Komintenti.NazivKomint, FinansijskaKartica.Duguje, FinansijskaKartica.JosOstaloDug, NalogZaKnjizenjeFin.Valuta, NalogZaKnjizenjeFin.SifPlacanja, NalogZaKnjizenjeFin.Storno, FinansijskaKartica.Zatvoren, NalogZaKnjizenjeFin.DatumNaloga, NalogZaKnjizenjeFin.VrstaNaloga, NalogZaKnjizenjeFin.RbrDokumenta, FinansijskaKartica.Potrazuje FROM (NalogZaKnjizenjeFin INNER JOIN FinansijskaKartica ON NalogZaKnjizenjeFin.RbrNaloga = FinansijskaKartica.RbrNaloga) INNER JOIN Komintenti ON FinansijskaKartica.SifKomint = Komintenti.SifKomint WHERE (((FinansijskaKartica.Konto)='20200') AND ((NalogZaKnjizenjeFin.Storno)=0) AND ((FinansijskaKartica.Zatvoren)=0)) ORDER BY FinansijskaKartica.JosOstaloDug DESC;


Uz pomoć ovog upita dobio sam sve zapise u sledećoj formi:
Šifra, Ime komitenta, iznos duga, valuta

Znači za svakog komitenta izlistao mi je sve pojedinačne fakture, kao i ugovorene valute plaćanja.
Može li neko da mi pomogne da prepravim upit na način da mi sabere JosOstaloDug za svakog komitenta (pošto su trenutno u pojedinačnim iznosima faktura) kao i da mi na osnovu valute, razbije sume duga u vremenskim intervalima dospelo za placanje i ono sto dospeva za svaku narednu nedelju.

Krajnja forma treba da izgleda na sledeći način:
SifKomint, NazivKomint, Suma JosOstaloDuguje (sto je dospelo za plaćanje), Suma JosOstaloDuguje (sto dospeva za plaćanje za 1 nedelju), Suma JosOstaloDuguje (sto dospeva za plaćanje za 2 nedelje)...

Ako nešto nisam najjasnije napisao, rado ću pojasniti.
Hvala unapred.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-3.sezampro.rs.



+322 Profil

icon Re: Slozeni upit pomoc09.03.2013. u 19:17 - pre 134 meseci
Hajde posto je ovo kao tesko, nesto sam pronasao ali mi ne radi i dalje.
Sta je problem sa ovim kodom?

Code:

Set rsRecordSet = New ADODB.Recordset
rsRecordSet.Open "select * FROM Table1 PIVOT (SUM (Iznos) FOR Ime IN ([Mladen], [Marko])) AS Total ", Cn, adOpenStatic, adLockOptimistic

 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-1.sezampro.rs.



+322 Profil

icon Re: Slozeni upit pomoc11.03.2013. u 20:57 - pre 134 meseci
102 pregleda i niko ne zna kako radi pivot u ms sql-u?
Svaka vam cast programeri.
Osnova svake osnove ako izuzmemo select * from tabela where x=2

A nekad je ovo stvarno bio najbolji tehnicki forum, tako reci pored njega ni jedan drugi nisam koristio.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Slozeni upit pomoc12.03.2013. u 08:06 - pre 134 meseci
Od 102 pregleda 101 je znao, ali nema smisla da ti se objasni. Toliko si pogresno napisao upit da nema smisla da ti se objašnjava.
Iz prvog posta se vidi da ne znaš ni običan SQL upit da napišeš, a o pivotu da ne pričamo.

Jedini način da dobiješ brz i tačan odgovor je da se potrudiš. Za forum baze podataka to znači da daš strukturu tabela (create table komande), niz INSERT komandi kojima napiniš tabele testnim podacima, pa onda da tačno objasniš šta želiš da dobiješ.

Ovako, nikome ne pada na pamet da skroluje pola metra u desno tvoj prvi post da bi provalio šta tu piše niti da analizira tvoj drugi post da bi znao šta ti želiš da dobiješ.

[Ovu poruku je menjao djoka_l dana 12.03.2013. u 09:16 GMT+1]
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-2.sezampro.rs.



+322 Profil

icon Re: Slozeni upit pomoc12.03.2013. u 17:47 - pre 134 meseci
Citat:
djoka_l: Toliko si pogresno napisao upit da nema smisla da ti se objašnjava.
Iz prvog posta se vidi da ne znaš ni običan SQL upit da napišeš, a o pivotu da ne pričamo.
[Ovu poruku je menjao djoka_l dana 12.03.2013. u 09:16 GMT+1]


Druze, prijatelju, prvi upit je upit koji je sastavio Microsoft, ako oni ne znaju da ga sastave onda...

Ja nisam programer, a kako su programeri obicno ljudi bez akcije (barem oni koje sam ja imao prilike da upoznam), onda sam ja kao ekonomista izvukao iz baze podatke koji meni trebaju i stao kod pivota. Posto 4 dana nisam mogao dobiti ikakav odgovor od bilo koga ovde, napisah sam svoju funkciju za pivot koja naravno radi 4x sporije nego sto bi to sql uradio ali radi, a ja resih svoje probleme i dobih finansijski izvestaj koji mi je potreban.

E sadza neke buduce malverzacije, mozes li mi napisati kako se pravilno radi sa pivotom?
Sifra__Iznos__Iznos1
1__1000__1000
2__1000__1000
1__200__1
2__300__2


Napravi mi najjednostaviniji upit, kojim ce SQL da mi pivotira podatke iz tabele Tabela1, na nacin sto ce sabrati sve iznose po istim siframa iz tabele1
Sifra__Iznos__Iznos1
1__1200__1001
2__1300__1002


 
Odgovor na temu

vujkev
Beograd

Član broj: 8072
Poruke: 1347
*.dynamic.isp.telekom.rs.



+104 Profil

icon Re: Slozeni upit pomoc12.03.2013. u 18:13 - pre 134 meseci
Da si odmah napisao ovakav zahtev, pa još i zakačio kod koji bi napravio test tabelu, dobio bi odgovor 100%. Lično sam video tvoju prvu poruku, ali kad sam video kilometarski upit, bez test tabele, nisam imao ni vremena ni želje da analiziram upit, kreiram test tabelu, čitam šta je problem pa nisam ni odgovorio. Mislim da je milion puta ponovljeno da je kod za pravljenje test tabele veoma poželjan.

Evo kompletnog rešenja

Code (tsql):
declare @tabla table  (Sifra int, Iznos int, Iznos1 int)
insert into @tabla select 1, 1000, 1000
insert into @tabla select 2, 1000, 1000
insert into @tabla select 1, 200, 1
insert into @tabla select 2, 300, 2

select * from @tabla

select sifra, sum(iznos), sum(iznos1)
from @tabla
group by sifra



Pozdrav.
Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-2.sezampro.rs.



+322 Profil

icon Re: Slozeni upit pomoc12.03.2013. u 19:10 - pre 134 meseci
Hm... sad sam malo zbunjen. Trenutno nisam u prilici da probam posto sam kuci ali nemam razloga da sumnjam. Medjutim ono sto me sada baca u dilemu je kada se onda koristi pivot a kada grupisanje? Trenutno mi ne pada na pamet primer za pivot, tj kada je on uopste potreban?

Hajde sada da napravimo jedan upit blizi realnosti.
Imam tabelu sa kolonama:sifra komitenta, naziv komitenta, iznos fakture, valuta placanja.
Da li postoji tako jednostavan upit koji ce da mi izlista tabelu tako da ona izgleda na sledeci nacin:
sifra komitenta, naziv komitenta, dospelo za placanje, dospeva za nedeljeu dana, dospeva za 2 nedelje, dospeva za 3 nedelje.

Ovo naravno izracunava na osnovu datuma valute, racunajuci od danasnjeg dana tj od dana kada pozivam upit.
Prikačeni fajlovi
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Slozeni upit pomoc12.03.2013. u 19:41 - pre 134 meseci
Ovo drugo pitanje je problem za pivot. Dospeće, koje je kolona iz tabele treba da postane kolona rezultata, umesto vrednost u vrsti.
Pisanje pivot upita je problem za tebe, tj. za bilo koga ko nije programer. Savetujem ti da napraviš upit koji daje rezultat po vrstama, zatim rezultat ubaciš u excel, pa onda u excelu da praviš pivot, što bez sumnje znaš.

Tvoje pitanje opet nije dovoljno dobro da se neko potrudi. Evo šta ti fali.

1. create table komanda da vidimo tačno na šta misliš. Recimo, ja znam da ti pod "valuta plaćanja" misliš na "datum valute plaćanja" odnosno datum kada plaćanje dospeva. Neko bi pomislio da je valuta plaćanja EUR ili 978. Razumeš zašto je potrebno create table? Kada napišeš da je valuta tipa date svako zna da je to datumsko polje.

2. da li je "valuta plaćanja" obavezno polje? To bi se takođe videlo iz create table komande. Ako jeste, stajalo bi da je to polje NOT NULL. Međutim, ako nije naglašeno da je polje NOT NULL, tada datum može da bude nedefinisan, a NULL aritmetika pravi gomilu sranja. Dakle ako polje može da bude NULL da li treba pretpostaviti da je datum valute današnji, neki datum u budućnosti ili neki datum u prošlosti?

3. Šta tebi znači dospeva sledeće nedelje? Ovo je ozbiljno pitanje. Recimo, ako upit puštaš u utorak, da li dospeća koja su od srede do petka ove nedelje idu u dospeća za sledeću nedelju ili u neku drugu kategoriju. Gde idu dospeća iz prošlosti? Dakle, kada pričaš o nekakvoj kategorizaciji, potrebno je da obuhvatiš SVE SLUČAJEVE. Dakle, kako se označavaju dospeća iz prošlosti, današnja dospeća, buduća dospeća u tekućoj nedelji, dospeća koja padaju u neradni dan (da li ih prebacuješ na prvi radni dan, recimo dospeća za subotu idu u istu kategoriju kao i dospeća za ponedeljak posle subote) itd.

4. Da li postoji gornje i/ili donje ograničenje. Recimo jedna kategorija dospeća starija od 180 dana, pa dospeća od 90 to 180 dana u prošlosti, pa dospeća od 90 do juče, pa današnje dospeća, pa dospeća do kraja nedelje, pa dospeća za 1,2,3,4, nedelju, pa dospeća koja su 5 i više nedelja u budućnosti. Neophodno je da kažeš koja je gornja granica za kategorizaciju, ako ćeš pisati pivot upit.

5. Poslednja stavka zbog čega se zahteva da daš create table i inseert komande, kao i da nacrtaš kakav rezultat želiš je i naša (programerska) sujeta. Ja, recimo, nikada na ovom forumu, nisam ostavio rešenje nekog problema (tj. upit koji rešava problem), a da ga nisam lično isprobao i dobio traženi rezultat. Jednostavno, ono što ovde napišem pod svojim imenom ostaje kao trag, a je ne želim da posle 20 godina iskustva kao DBA, neko pomisli kako brljam i pišem gluposti.

Kada se ti potrudiš da opišeš problem, bar ovoliko opširnoi koliko sam ti ja opisao šta ne valja u tvom pitanju, onda ćeš dobiti i brz i pouzdan odgovor.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-2.sezampro.rs.



+322 Profil

icon Re: Slozeni upit pomoc12.03.2013. u 19:55 - pre 134 meseci
1) stavio sam tabelu u Accessu kao primer, verovatno si je prevideo
2) valuta je obavezno polje
3) Ako je danas 12.03. dospeva sledece nedelje je period 13.03.-19.03. (nema prebacivanja subote, nedelje, jednostavno dodaje se 7 dana)
4) prva tabela treba da bude sta se kasni u placanju vise od 60 dana, pa sta se kasni do 60 dana, pa sta dospeva za nedelju dana, za 2.... ali nisam komplikovao jer kad shvatim sustinu tog upita lako cu ga podesiti da pokazuje detalje
5) goto 1 (mada programeri ne vole ovu komandu)

Citat:
Pisanje pivot upita je problem za tebe, tj. za bilo koga ko nije programer

Nista ne brini, savladao sam ja i mnogo teze stvari od toga. Jednostavno ovim se nikada nisam bavio jer mi nikada nije trebalo a kao sto si video, ne bezim ni od kilometarskih upita iz prvog posta koji te je mrzelo da pogledas. Jednostavno, kada mi je nesto potrebno imam zivce, cesto i vise nego sto treba. Nikada se nisam bavio SQL-om ali sam se konektovao na server, povezao 3 tabele, filtlirao podatke koji su mi bili potrebni, bez ikakve pomoci sa strane i zakucao se kod pivota jer nije proradilo nista sto sam bio probao.




[Ovu poruku je menjao Blue82 dana 12.03.2013. u 21:08 GMT+1]
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Slozeni upit pomoc13.03.2013. u 09:41 - pre 134 meseci
Uh, opet me nisi slušao, pa si stavio Access tabelu, a pitanje se odnosi na MS SQL.
Sintaksa pivot upita u MS SQL i Accessu je potpuno drugačija (u stvari i SQL se razlikuje).

Evo ti rešenja za Access (u Accessu se pivot zove crosstab query)

Code:

TRANSFORM Sum(Tabela1.Iznos) AS SumOfIznos
SELECT Tabela1.SifraKomitenta, Tabela1.NazivKomitenta
FROM Tabela1
GROUP BY Tabela1.SifraKomitenta, Tabela1.NazivKomitenta
PIVOT Switch(DateDiff("d",Date(),Tabela1.Valuta)<-60,"Više od 60 dana",DateDiff("d",Date(),Tabela1.Valuta) Between -60 And 0,"0-60 dana",DateDiff("d",Date(),Tabela1.Valuta)>0, Int(DateDiff("d",Date(),Tabela1.Valuta)/7)+1 & " nedelja/nedelje");


Napravi novi query u Accessu, desni klik na query pa odaberi SQL View, pa onda iskopiraj moj kod da vidiš rezultat.


Edit: I, naravno, pošto nisam imao dobre podatke za testiranje napravio sam grešku. Ispalo mi je da sedmi dan od danas upada u drugu nedelju, umesto u prvu, četrnaesti u treću umesto u drugu itd. Zato poslednji red treba da se izmeni, pa umesto

Int(DateDiff("d",Date(),Tabela1.Valuta)/7)+1

treba

Int((DateDiff("d",Date(),Tabela1.Valuta)-1)/7)+1

[Ovu poruku je menjao djoka_l dana 13.03.2013. u 11:00 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Slozeni upit pomoc13.03.2013. u 10:54 - pre 134 meseci
Citat:
Druze, prijatelju, prvi upit je upit koji je sastavio Microsoft, ako oni ne znaju da ga sastave onda...

Ja nisam programer, a kako su programeri obicno ljudi bez akcije (barem oni koje sam ja imao prilike da upoznam), onda sam ja kao ekonomista izvukao iz baze podatke koji meni trebaju i stao kod pivota.


Prvi upit nije sastavio Microsoft nego neki query builder i nije napravljen da ga čita živ čovek. Ovako taj upit izgleda kada ga živ čovek sredi da bi ga drugi živi čovek analizirao:

Code (sql):

SELECT FinansijskaKartica.Konto, FinansijskaKartica.SifKomint,
       Komintenti.NazivKomint,
       FinansijskaKartica.Duguje, FinansijskaKartica.JosOstaloDug,
       NalogZaKnjizenjeFin.Valuta, NalogZaKnjizenjeFin.SifPlacanja, NalogZaKnjizenjeFin.Storno,
       FinansijskaKartica.Zatvoren,
       NalogZaKnjizenjeFin.DatumNaloga, NalogZaKnjizenjeFin.VrstaNaloga, NalogZaKnjizenjeFin.RbrDokumenta,
       FinansijskaKartica.Potrazuje
  FROM (NalogZaKnjizenjeFin
  INNER JOIN FinansijskaKartica
    ON  NalogZaKnjizenjeFin.RbrNaloga = FinansijskaKartica.RbrNaloga)
 INNER JOIN Komintenti
    ON FinansijskaKartica.SifKomint = Komintenti.SifKomint
 WHERE (((FinansijskaKartica.Konto) = '20200') AND
       ((NalogZaKnjizenjeFin.Storno) = 0) AND
       ((FinansijskaKartica.Zatvoren) = 0))
 ORDER BY FinansijskaKartica.JosOstaloDug DESC;
 


A drugo, nije tačno da su "programeri ljudi bez akcije". Upravo suprotno - ne znam ni jednog dobrog programera kojeg ne fascinira rešavanje SLOŽENIH problema. Sa druge strane, programeri nisu ni magarci, pa ih rešavanje TRIVIJALNIH problema krajnje zamara, pa otkače onoga ko im to postavi (a nije im šef). Moguće je, naročito ako si u društvenoj firmi, da tvoji programeri veze nemaju.

Verovatno ću danas da pokušam da ti napišem i upit za MS SQL, ali me ubija u pojam potreba da sam napišem crete naredbu i test podatke (ti bi rekao na to, možda, da sam ja "čovek bez akcije").
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Slozeni upit pomoc13.03.2013. u 12:21 - pre 134 meseci
Uh, evo i MS SQL koda

Code (sql):

CREATE TABLE TestPivot (
     Sifra INT NOT NULL,
     Naziv nvarchar(50) NOT NULL,
     Iznos DECIMAL(18,2) NOT NULL,
     DatumValute DATE NOT NULL)
     
INSERT INTO TestPivot SELECT 1, 'Klijent 1', 1000, GETDATE()-120
INSERT INTO TestPivot SELECT 1, 'Klijent 1',    1, GETDATE()-61
INSERT INTO TestPivot SELECT 1, 'Klijent 1', 1000, GETDATE()-60
INSERT INTO TestPivot SELECT 1, 'Klijent 1',    2, GETDATE()
INSERT INTO TestPivot SELECT 1, 'Klijent 1', 1000, GETDATE()+1
INSERT INTO TestPivot SELECT 1, 'Klijent 1',    3, GETDATE()+7
INSERT INTO TestPivot SELECT 1, 'Klijent 1', 1000, GETDATE()+15
INSERT INTO TestPivot SELECT 1, 'Klijent 1',    4, GETDATE()+21
INSERT INTO TestPivot SELECT 1, 'Klijent 1', 1005, GETDATE()+36
INSERT INTO TestPivot SELECT 2, 'Klijent 2', 1006, GETDATE()-61
INSERT INTO TestPivot SELECT 2, 'Klijent 2', 1007, GETDATE()+22
INSERT INTO TestPivot SELECT 3, 'Klijent 3', 1008, GETDATE()+36

SELECT Sifra, Naziv, Kategorija, SUM(Iznos) Saldo
FROM (
SELECT Sifra, Naziv, Iznos, Kategorija=
      CASE
         WHEN dd < -60 THEN '>60 dana'
         WHEN dd BETWEEN -60 AND 0 THEN 'od 60 do danas'
         WHEN dd BETWEEN 1 AND 7 THEN 'za 1 nedelju'
         WHEN dd BETWEEN 8 AND 14 THEN 'za 2 nedelje'
         WHEN dd BETWEEN 15 AND 21 THEN 'za 3 nedelje'
         WHEN dd BETWEEN 22 AND 35 THEN 'za 4 nedelje'
         ELSE 'za više od 5 nedelja'
      END
FROM (SELECT Sifra, Naziv, Iznos, DATEDIFF(DAY, getdate(), DatumValute) AS dd FROM TestPivot) x
) y
GROUP BY Sifra, Naziv, Kategorija

SELECT Sifra, Naziv,
          [-1] ">60 dana",
          [0] "od 60 do danas",
          [1] "za 1 nedelju",
          [2] "za 2 nedelje",
          [3] "za 3 nedelje",
          [4] "za 4 nedelje",
          [5] "za više od 5 nedelja"
FROM (
SELECT Sifra, Naziv, Iznos, Kategorija=
      CASE
         WHEN dd < -60 THEN -1
         WHEN dd BETWEEN -60 AND 0 THEN 0
         WHEN dd BETWEEN 1 AND 7 THEN 1
         WHEN dd BETWEEN 8 AND 14 THEN 2
         WHEN dd BETWEEN 15 AND 21 THEN 3
         WHEN dd BETWEEN 22 AND 35 THEN 4
         ELSE 5
      END
FROM (SELECT Sifra, Naziv, Iznos, DATEDIFF(DAY, getdate(), DatumValute) AS dd FROM TestPivot) x
) y
pivot (
  SUM(Iznos)
FOR Kategorija  IN ([-1], [0], [1], [2], [3], [4], [5])
) AS pvt
 


Prvo ide komanda za kreiranje tabele, zatim popunjavanje test podacima, sledi upit bez pivota (vidi sliku rezultata), pa onda pivot upit (i odgovarajuća slika)



Evo slike pivot rezultata.



Naravoučenije: NE KORISTITI PIVOT UPITE NEGO PIVOTE PRAVITI U EXCELU!!!
Prikačeni fajlovi
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-3.sezampro.rs.



+322 Profil

icon Re: Slozeni upit pomoc13.03.2013. u 19:11 - pre 134 meseci
Ovako,
prvo sam pogledao prvi primer za Access i on mi je kompletno jasan. Probao sam da ga modifikujem za moje potrebe i radi kako treba (razumeo u celosti).
Moze li malo pojasnjenje kako bi upit trebalo da glasi za slucaj da u tabeli imam 2 iznosa koja treba da se saberu a ne samo jedan kao sto je bilo u ovom primeru. Pokusao sam ovako, ali kaze da postoji greska u sintaksi:
Code (sql):

TRANSFORM SUM(Tabela1.Iznos) AS SumOfIznos, SUM(Tabela1.Iznos1) AS SumOfIznos1
 SELECT Tabela1.SifraKomitenta, Tabela1.NazivKomitenta
 FROM Tabela1
 GROUP BY Tabela1.SifraKomitenta, Tabela1.NazivKomitenta
 PIVOT Switch(DateDiff("d", DATE(), Tabela1.Valuta)<-60,"Više od 60 dana",
 DateDiff("d",DATE(), Tabela1.Valuta) BETWEEN -60 AND 0,"0 do 60 dana",
 DateDiff("d", DATE(), Tabela1.Valuta)>0,
 INT((DateDiff("d",DATE(),Tabela1.Valuta)-1)/7)+1 & " nedelja/nedelje");
 


Greska je naravno u ovom delu koji sam dodao Sum(Tabela1.Iznos1) AS SumOfIznos1, ocigledno ne treba da stoji tu. Ne moras isprobavati upit u smislu da li radi jer pretpostavljam da tako nesto jednostavno ne mozes da pogresis. Dakle kako bi on izgledao kada bih u tabeli pored kolone Iznos imao i kolonu Iznos1. Resenje treba da je identicno prethodnom samo pored kolone sum(iznos) da prikaze i kolonu sim(iznos1)? Access je u prilogu.

Sada cu pogledati i upit sa SQL koji si napravio pa napisem utiske.

Citat:

Sa druge strane, programeri nisu ni magarci, pa ih rešavanje TRIVIJALNIH problema krajnje zamara, pa otkače onoga ko im to postavi (a nije im šef). Moguće je, naročito ako si u društvenoj firmi, da tvoji programeri veze nemaju.


Ja sam finansijski direktor jedne privatne firme. Kako sam profesionalno poprilicno zadrt, volim da sve bitne stvari koje mi po neko servira proverim licno i neces verovati koliko izvestaja dobijam pogresno, sto zbog greske radnika, sto zbog pokusaja skrivanja odredjene informacije. Pogotovo je problem sa programerima jer njima je sve to obrada podataka, bez sustinskog razumevanja sta rade, a meni je mnogo bitnija informacija (ako se dobro secam ta 2 termina iz srednje skole). Pre 5 dana sam zatrazio da mi se u bazu ubace podaci koje je moja sluzba spremila u Excel-u (radi se o mnogo razlicitih unosa za svakog pojedinacnog komitenta), na cega sam dobio odgovor da to ne moze da se radi iz Excel-a vec im se sve te tabele trebaju obraditi na nacin, koji je informaticki i mnogo se razlikuje od nacina na koji mi ekomomisti razmisljamo. To je znacilo da sve sto smo radili danima, mozemo da se bacimo u vodu. Trazio sam odgovor napismeno, i cim sam ga dobio seo sam i za 5 minuta napisao program na papiru kojim ce podatke iz excela iscitavati jedan po jedan i koristiti ih kao ulazni podatak za njihov program. Pozvao sam njihovog sefa kod generalnog direktora i u roku od odmah su dvojica glavnih dobili otkaz. Trenutno razvrstavam sve kupce i dobavljace za jednu siroku analizu dospeca placanja, pa mi je ovo sto sam vas ovde ispitivao veoma potrebno.






[Ovu poruku je menjao Blue82 dana 13.03.2013. u 20:42 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-3.sezampro.rs.



+322 Profil

icon Re: Slozeni upit pomoc13.03.2013. u 19:54 - pre 134 meseci
Mislim da shvatam i sustinu SQL-a
Code (sql):

SELECT Sifra, Naziv, Kategorija, SUM(Iznos) Saldo
FROM (
SELECT Sifra, Naziv, Iznos, Kategorija=
       CASE
          WHEN dd < -60 THEN '>60 dana'
          WHEN dd BETWEEN -60 AND 0 THEN 'od 60 do danas'
          WHEN dd BETWEEN 1 AND 7 THEN 'za 1 nedelju'
          WHEN dd BETWEEN 8 AND 14 THEN 'za 2 nedelje'
          WHEN dd BETWEEN 15 AND 21 THEN 'za 3 nedelje'
          WHEN dd BETWEEN 22 AND 35 THEN 'za 4 nedelje'
          ELSE 'za više od 5 nedelja'
       END
FROM (SELECT Sifra, Naziv, Iznos, DATEDIFF(DAY, getdate(), DatumValute) AS dd FROM TestPivot) x
) y
 

Ovde prvo sabira sum(iznos) i taj zbir ce u novoj tabeli nazvati 'saldo'. Dodeljuje novu kolonu 'kategorija' koju razvrstava po razlici sadasnjeg datuma i valute u liniji FROM (SELECT Sifra, Naziv, Iznos, DATEDIFF(DAY, getdate(), DatumValute) AS dd FROM TestPivot) x
) y i sve ih grupise. Tu mi je cudno sto se 'dd' pise na kraju tog dela komande gde razvrstava a samo razvrstavanje je iznad ali mogu prihvatiti da se to tako radi i da se samo kosi sa mojom logikom.

Code (sql):

SELECT Sifra, Naziv,
           [-1] ">60 dana",
           [0] "od 60 do danas",
           [1] "za 1 nedelju",
           [2] "za 2 nedelje",
           [3] "za 3 nedelje",
           [4] "za 4 nedelje",
           [5] "za više od 5 nedelja"
FROM (
 


U ovom delu je uz oznaku '>60 dana' dodelio vrednost [-1], zatim [0]... a pretpostavljam da si te vrednosti tako naznao a mogao je da se zove i drugacije, samo je bitno da se isto takvo nalazi na kraju upita FOR Kategorija IN ([-1], [0], [1], [2], [3], [4], [5]) i na osnovu toga ih ponovo grupise.
Da li sam upravu? Nisam isprobao sql upit posto sam sada kuci ali verujem da mi je logika razmisljanja tacna?
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Slozeni upit pomoc13.03.2013. u 20:27 - pre 134 meseci
Skoro da si razumeo, samo je logika obrnuta.

Ono što se prvo izvršava je upit koji je najdublje ugnežđen, a to je:

SELECT Sifra, Naziv, Iznos, DATEDIFF(DAY, getdate(), DatumValute) AS dd FROM TestPivot

Jedina svrha ovog upita je da mi umesto datuma valute da razliku u danima od današnjeg do datuma valute i da tu razliku nazove "dd". Cilj je bio da izbegnem ponavljanje izraza DATEDIFF(DAY, getdate(), DatumValute) na puno mesta.

Taj subquey sam nazvao "x" i on mi daje rezultat za sledeći nivo:

Code:

SELECT Sifra, Naziv, Iznos, Kategorija=
       CASE
          WHEN dd < -60 THEN '>60 dana'
          WHEN dd BETWEEN -60 AND 0 THEN 'od 60 do danas'
          WHEN dd BETWEEN 1 AND 7 THEN 'za 1 nedelju'
          WHEN dd BETWEEN 8 AND 14 THEN 'za 2 nedelje'
          WHEN dd BETWEEN 15 AND 21 THEN 'za 3 nedelje'
          WHEN dd BETWEEN 22 AND 35 THEN 'za 4 nedelje'
          ELSE 'za više od 5 nedelja'
       END
FROM x


Dakle "pseudotabela" ili dinamički pogled ili subquery x ima polja Sifra, Naziv, Iznos i dd. Jedina svrha gornjeg upita je da mi od polja dd podupita x napravi polje Kategorija. Opet, podupit sam napravio samo da bi mi bilo elegantnije pisanje GROUP BY klauzule.

Upit koji radi posao je, u stvari

Select Sifra, Naziv, Kategorija, sum(Iznos) Saldo
from y
group by sifra, naziv, kategorija

Citat:
a pretpostavljam da si te vrednosti tako naznao a mogao je da se zove i drugacije, samo je bitno da se isto takvo nalazi na kraju upita FOR Kategorija IN ([-1], [0], [1], [2], [3], [4], [5]) i na osnovu toga ih ponovo grupise.
Da li sam upravu?


U pravu si da sam ih ovde drugačije nazvao i da naziv može da se promeni. Nisi u pravu za ono "ponovo grupiše".
Ovde zapravo kažeš koje kolone od svih mogućih treba da prikaže u rezultatu. Da si, na primer, napisao For Kategorija in ([-1]) query bi ispisao samo sume iznosa za kašnjenja više od 60 dana, a sve ostale vrednosti polja Kategorija bi izbacio iz računanja.


Što se tiče Access pitanja, ne znam da li može da bude više od jedne agregacije u pivotu. Po onome što sam video na netu, izgleda da ne može. Ja se ne bavim profesionalno Accessom, poslednji put sam ozbiljno radio na njemu '97. ili '98. tako da nisam siguran. Crosstab sam dobio na osnovu wizarda (da bih dobio kostur upita), pa sam ga onda ručno menjao u SQL-u da bih dobio ono što je bio krajnji rezultat. Pokušaj da sam otkriješ da li je moguće, ali sumnjam.

da ponovim:
Naravoučenije: NE KORISTITI PIVOT UPITE NEGO PIVOTE PRAVITI U EXCELU!!!

Excel može da stavi više agregacija u pivot. KORISTITE EXCEL. Pivot upiti su jedna jako ružna konstrukcija nakalemljena na SQL. Svi alati koji rade dobre pivote liče na Excel, ili su Excel (recimo Oracle Discoverer jako liči na Excel, a MS SQL koristi Excel da bi se prikazale kocke - Cubes).

EXCEL je alat za pivot!!!
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-3.sezampro.rs.



+322 Profil

icon Re: Slozeni upit pomoc13.03.2013. u 20:47 - pre 134 meseci
@djoka_l i @vujkev iskreno zahvaljujem na odgovorima. Dosta su prosirili moje znanje na ovu temu.
Ovom "obrnutom logikom" mi sada sve dolazi na svoje logicno mesto.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Slozeni upit pomoc13.03.2013. u 20:53 - pre 134 meseci
Citat:
Pre 5 dana sam zatrazio da mi se u bazu ubace podaci koje je moja sluzba spremila u Excel-u (radi se o mnogo razlicitih unosa za svakog pojedinacnog komitenta), na cega sam dobio odgovor da to ne moze da se radi iz Excel-a vec im se sve te tabele trebaju obraditi na nacin, koji je informaticki i mnogo se razlikuje od nacina na koji mi ekomomisti razmisljamo.


Da li primećuješ šta je osnovna i najveća greška u ovome što si napisao?

Slažem se da ekonomisti i programeri različito razmišljaju. Međutim, TI si naredio da tvoja služba popuini neke podatke u excelu pa si onda tražio od programera da to obrade.

Pravi pristup je sledeći: pozoveš programere i pitaš ih na koji način je najbolje da se pripreme podaci koji treba da idu u bazu. Nađete kompromis između onoga što je zgodno da se obradi i onoga što je zgodno da se unese u excel, pa se TEK ONDA naredi službi koja unosi podatke u excel da to i uradi.

Izgleda da ti je manir da ideš glavom kroz zid. To vidim i na osnovu tvojih pitanja. Ne umeš da formulišeš problem na način koji je razumljiv informatičarima, pa se onda ljutiš kada ne dobiješ odgvor ili dobiješ odgovor koji ti se ne sviđa.

Ključna reč je saradnja i malo slušanja i druge strane.

Što se tiče programera koji ne razumeju stvari kao i ekonomisti, imaš dva rešenja:
1. Nađi programere koji poznaju računovodstvo i ekonomiju (i plati ih koliko traže)
2. NAUČI postojeće programere osnovama računovodstva i time ih osposobi da odgovore na tvoje buduće zahteve.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-3.sezampro.rs.



+322 Profil

icon Re: Slozeni upit pomoc13.03.2013. u 21:28 - pre 134 meseci
Djoko, ne znam koliko radis, ali ako ti je radno vreme u proseku od 7 ujutru do 7 uvece i ako u 7 uvece jos uvek nisi uradio veliki deo onoga sto si planirao za taj dan, onda tvoje vreme postane veoma skupo.
Po mojoj logici programeri i osoblje za informaticku podrsku uopste, tu su zbog svih nas ostalih a ne obrnuto. Racunari nisu kupljeni da bi ih imao ko odrzavati, vec su oni neophodni da bi na osnovu velike kolicine razlicitih podataka krajnji korisnici (referenti i menadzment) donosili odluke, idealno bi bilo u realnom vremenu ili barem priblizno tome. Ako ovo nije izvodljivo, onda u celoj organizaciji nesto opasno skripi. Zbog toga nikako ne stoji ona konstatacija da programere smaraju jednostavni upiti, jer mene ne treba da interesuje da li je njemu to smor ili ne, vec da li ja u roku od 10 minuta mogu da dobijem informaciju za koju mi je inace potrebno da je obradjuje dvoje ljudi narednih 8h. Ako on to moze da mi obezbedi, a smor mu je, i zbog toga citavo osoblje bude angazovano na poslovima stapa i kanapa, a za to vreme propustaju bitne stvari, onda takvom smor informaticaru u mojoj blizini jednostavno nije mesto.

Vecina zaposlenih u svakoj firmi nema pojma o informatici i nacinu na koji racunari rade. Mnogima je i sam Excel bauk i nikada ga nece savladati i zato se ne moze ocekivati da krajnji korisnik sredjuje podatke u razlicite datoteke, da programeru tog dana ne bi bio smor i da bi mogao da ih prevuce jednim klikom. Dobar programer je osoba koja moze da se prilagoti krajnjem korisniku jer od njega zivi i u krajnjoj liniji za njega radi. Ni jedan program nije sam sebi svrha, barem je to moje glediste.

I nemoj slucajno shvatiti da je ton mog govora da je informaticar nize bice, manje vredan i ne znam ti sta, jer to nemam nameru da kazem, vec kao sto sam ja pogresno citao tvoj upit od gore ka dole, tako si i ti u ovom slucaju obrnuo ko zbog koga u tom nizu postoji. Naravno uspesna organizacija je ona koja ima odlicno informaticko osoblje i obicne referente kojima ce ovi pomagati.

[Ovu poruku je menjao Blue82 dana 13.03.2013. u 22:39 GMT+1]
 
Odgovor na temu

[es] :: MS SQL :: Slozeni upit pomoc

[ Pregleda: 4998 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

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