Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 11 odgovora
  • 4.585 pregleda

Najnovija ↓

Access i SQL1999 :( 27.11.2008. u 17:31 · pre 218 meseci
izmenjeno 1 put, poslednji put tmpKorisnik 27.11.2008. u 23:30
  1. tmpKorisnik27.11.2008. u 23:30zapis iz teksta poruke
#1
Koliko sam upucen na FON u se radi SQL na osnovu SQL1999 standarda.
Mislim da mi zbog toga sledeci upit ne radi u Accessu:

Code:

SELECT (CASE WHEN EXTRACT (MONTH FROM P.DATUMVREME)IN (1,2,3) THEN '1'
             WHEN EXTRACT (MONTH FROM P.DATUMVREME)IN (4,5,6) THEN '2' 
             WHEN EXTRACT (MONTH FROM P.DATUMVREME)IN (7,8,9) THEN '3'
             WHEN EXTRACT (MONTH FROM P.DATUMVREME)IN (10,11,12) THEN '4'
END)AS KVARTAL,
    V.TIPVOZILA, COUNT(*)AS UKUPAN_BROJ_PLANIRANIH_POLAZAKA, 

SUM(CASE WHEN P.STATUS ='USPESAN'THEN 1 ELSE 0 END)AS BROJ_USPESNIH,

SUM(CASE WHEN P.STATUS ='OTKAZAN'THEN 1 ELSE 0 END)AS BROJ_OTKAZANIH,    
SUM(CASE WHEN P.STATUS ='KASNJENJE'THEN 1 ELSE 0 END)AS BR_POL_SA_KASNJ

FROM POLAZAK P INNER JOIN VOZILO V ON P.SIFRAVOZILA = V.SIFRAVOZILA

WHERE EXTRACT (YEAR FROM P.DATUMVREME) = 2004

GROUP BY CASE WHEN EXTRACT(MONTH FROM P.DATUMVREME) IN (1,2,3) THEN '1'
              WHEN EXTRACT(MONTH FROM P.DATUMVREME) IN (4,5,6) THEN '2' 
              WHEN EXTRACT(MONTH FROM P.DATUMVREME) IN (7,8,9)THEN '3'              
              WHEN EXTRACT(MONTH FROM P.DATUMVREME) IN (10,11,12) THEN '4' END, V.TIPVOZILA;



u helpu za ACCESS sam uspeo da pronadjem zamenu za : EXTRACT(MONTH FROM P.DATUMVREME) to je jednostavna Month(P.DATUMVREME) f-ja
ali ne mogu da pronadjem koja je sintaksa CASE naredbe.

Mislim da Access koristi ANSISQL92 (siguran sam za Access2003) standard...moze me neko malo uputiti...neke reference ili...

PS
Primer koji sam naveo je sa sajta FON-a Baze podataka, kao i resenje ali i Access baza nad kojom radim upite :(

Pozdrav
Re: Access i SQL1999 :( 28.11.2008. u 00:09 · pre 218 meseci #2
Pa dobro...moze li mi bar neko reci koja je sintaksa za
CASE izraz a moze se primeniti u ACCESSu

U SQL1999 je:

CASE
WHEN uslov1 THEN rezultat1
WHEN uslov2 THEN rezultat2
...
END.

,ali to NE RADI u ACCESSu (2003 ili 2000).

Moze li primer jednostavnog CASE izraza...upit nad jednom tabelom i nad jednom kolonom?
Re: Access i SQL1999 :( 28.11.2008. u 16:36 · pre 218 meseci #3
Conditional Expressions

Access: IIF(Condition, ReturnIfTrue, ReturnIfValue)
T-SQL: CASE WHEN Condition THEN ReturnIfTrue ELSE ReturnIfFalse END

Converting NULL values

Access: NZ(Value, ValueToReturnIfNull)
T-SQL: COALESCE(Value, ValueToReturnIfNull) -- or -- ISNULL
Potpis
zxz
Re: Access i SQL1999 :( 28.11.2008. u 17:30 · pre 218 meseci #4
Vidiš kako je prostije u Accessu?:) A ekvivalent za Extract (MONTH FROM DatumVreme) je samo Month(DatumVreme), Year(DatumVreme) i tako...
Potpis
Ozbiljan i odgovoran mladić
Re: Access i SQL1999 :( 28.11.2008. u 19:12 · pre 218 meseci #5
Ako koristis Access za vezbanje SQL, onda ne moze CASE da radi. Postoje zamene za CASE, kao sto vidis.

Medjutim, tvoj SQL izkaz sa CASE i GROUP BY nije nista drugo nego ono sto se u SQL zove PIVOT. To si mogao i u MS SQL da postignes sa PIVOT. Naravno da je u MS SQL lakse napisati CASE i GROUP BY nego PIVOT. E sad, kad je PIVOT u pitanju, tu Access ima jednu malu tajnu, a to je Cross-tab wizard. Upotrebom Accessovog Cross-tab wizarda dobijes bas ono sto ti treba:

Kvartal Planirano Uspesno Otkazano Kasnjenje
---------------------------------------------


Posao je laksi ako prethodno napravis kveri koji izracunava kvartal i vraca Kvartal (1,2,3,4) i Status (Uspesno/Otkazano/Kasnjenje)

Q1:
SELECT Kvartal, Status
FROM <nesto>

Onda na taj Q1 primenis CrossTab kveri (upotrebis wizard) i dobijes Uspesno/Otkazano/Kasnjenje po kvartalu u zaglavlju rezultata, a Ukupno ce ti wizard pokazati kao COUNT(*) to jest SUM(Uspesno/Otkazano/Kasnjenje) za svaki red. Probaj i videces da je mnogo lakse nego u ANSI SQL ili ovo sto ti savetuju sa Switch, IF i slicno.


Kako izracunati kvartal? Moze switch, evo funkcija, iako ne preporucujem:
Code:

Function Q(intMonth As Integer) As Integer

If Month > 12 Or Month < 1 Then
    Q = 0
End If

Q = Switch(intMonth = 1, 1 _
            , intMonth = 2, 1 _
            , intMonth = 3, 1 _
            , intMonth = 4, 2 _
            , intMonth = 5, 2 _
            , intMonth = 6, 2 _
            , intMonth = 7, 3 _
            , intMonth = 8, 3 _
            , intMonth = 9, 3 _
            , intMonth = 10, 4 _
            , intMonth = 11, 4 _
            , intMonth = 12, 4)

End Function


Zastio ne preporucujem ovakvo resenje:
Meni bi bilo lakse da napravim tabelu Q sa 12 rekorda, (Month,Q) i da je onda koristim u kverijima sa mesecima da mi vrati kvartal. Da koristis SWITCH , ili udf u kveriju - nije bas efikasno, sporo je i sa malim brojem rekorda.

:-)

Re: Access i SQL1999 :( 28.11.2008. u 20:24 · pre 218 meseci #6
Poštovani druže Zidar:

Zašto ne :
Code:
Public Function Kvartal(KojiMesec As Byte)
Kvartal = Int((KojiMesec + 2) / 3)
End Function
?
Potpis
Ozbiljan i odgovoran mladić
Re: Access i SQL1999 :( 28.11.2008. u 23:39 · pre 218 meseci #7
Nikola, odlicno zapazanje i odlicna funkcija. Ali funkcija u Access kveriju nije dobra ideja, kakva god da je. Poenta je da coveku treba cross-tab kveri i ako moze SQL resenje. Znas ono 'The best code is no code at all' :-)
Re: Access i SQL1999 :( 29.11.2008. u 01:48 · pre 218 meseci #8
Hvala vam puno, pomogli ste... ma ubise me silni standardi...
Ono sto zelim jeste da NAUCIM da radim sa SQL om...ali sa sto manje wizarda...znaci cist SQL kod...SQL1999 ili neki drugi standard

Radio sam neke proste upite, i upite nad vise tabela pomocu MSEntManagera, sto me je dosta "zaglupilo".
Uglavnom sam razvijao ADO.NET aplikacije i sasvim mi je bilo dovoljno da generisem upip preko MSEntMngr pa ga kopiram u aplikaciju ili ako imam pristupa bazi samo ga pozovem... Medjutim shvatio sam da od toga nema 'leba kad sam bio na malo ozbiljnijem razgovoru za posao. Tako da sam sada uzeo skripte sa FON-a i polako sve iz pocetka :( i posto sam ranije radio sa nekim drufgim standardom...(vise zabusavao) resio sam da zakrpim rupe u znanju (ne znanju :( )...i u startu se vec pojavise problemcici... A ja kao nabiflao SQL1999 :D

Jos jednom hvala na pomoci!

Ako bilo ko moze da me uputi na STA I KAKO...neka dobra knjiga ili izvor na netu...prikladno mom problemu neka postuje :)
jer ja ne znam odakle da pocnem :) a vi imate iskustva... Inace nemojte mi reci GOOGL jer dok skinem materijal, proucim ga, razvrstam...odose dani... mada tako radim.
Eto malo gotovanim ali se nadam da me razumete (i voljni ste pomoci) :D

E, da.. koja baza podrzava 100% SQL1999?

I za admina: Znam da tema ima veze sa accessom (ali u tom konretnom primeru) samo sam mislio da je bolje da bude u Baze podataka jer sam ocekivao neke paralele izmedju standarda i implementacije konretnih standarda u konretnim bazama podataka...

UH smorih i sebe, a ne vas
Re: Access i SQL1999 :( 29.11.2008. u 14:42 · pre 218 meseci #9
Ajme Nikolaaaaa, vidi se da apstiniraš od alkohola
pa u accessu ima funkcija ,

Kvartal = DatePart("q", bilokojidatum)

No složio bi se s Zidarom a i ne, nije preporučljivo koristiti funkcije ako su tabele velike , usporava izvršenje
queria, ali zanemarivo ako su tablice relativno male, a upiti se ne koriste tako često.

Re: Access i SQL1999 :( 29.11.2008. u 17:15 · pre 218 meseci #10
Ajme Trle, mojne sa mnom te fore ovo ono :) Drug Zidar je rekao da je argument mesec, tj broj od 1-12...
Potpis
Ozbiljan i odgovoran mladić
Re: Access i SQL1999 :( 29.11.2008. u 18:15 · pre 218 meseci #11
No dobro dobro, imas pravo al ja sam posao od gore navedenog
.........
SELECT (CASE WHEN EXTRACT (MONTH FROM P.DATUMVREME)IN (1,2,3) THEN '1'
WHEN EXTRACT (MONTH FROM P.DATUMVREME)IN (4,5,6) THEN '2'
WHEN EXTRACT (MONTH FROM P.DATUMVREME)IN (7,8,9) THEN '3'

..........

datum su pretvarali u mjesece sto nije bilo potrebno,
hehe a mozda je i Zidar presao na našu metodu "programiranja" , al on mjesto pive koristi nešto zesce

funkcija ti je inače OK

Re: Access i SQL1999 :( 01.12.2008. u 16:45 · pre 218 meseci #12
:-)
Moram Nikoli ponovo da dam pohvalu za funkciju - jer se njalakse moze iskoristiti u kveriju.

SELECT
KojiMjesec
, Int((KojiMesec + 2) / 3) AS Kvartal
FROM TAbela


To ce da radi brze nego

SELECT KojiMjesec, Fun(KojiMjesec) AS Kvartal FROM Tabela

pa ma kako bila funkcija FUN dobro napisana. Od sve tri ponudjene funkcije, Nikolina bi radila najbrze, pa verovatno Trletova i moja tek na kraju. Zato i ne pisem funkcije ako bas ne moram :-) A opet, ne moz' covek uvek da se seti resenja bez programiranja.

I Trle je u pravu - ako nema puno podataka, moze i korisnicka funkcija u kveriju. Nije po ANSI standaru, ali ni jedan SQL produkt nije 100% po standardu, pa nikom nista.

Volim kad su svi u pravu.

:-)
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme