BEGIN TRANSACTION …

(by: Jasmin Azemović)

Demistificirani SQL (1)

with 3 comments

Odlučio sam da studentima povremeno postavim rješenje isptnih zadataka sa predmeta “Upravljanje bazama podataka” djela vježbi i workshoop(a) gdje se najviše radi sa SQL komandama (DML i DDL). Odabrit ću one upite koji koji su bili  “teži” tj. studenti su imali poteškoća prilikom implementacije rješenja. Naravno, ako osjetim da je to potrebno ova serija postova može postati redovna…ali to nije do mene nego do auditorijuma.

Cilj postova nije da studenti memorišu upite i na takav način pokušaju proći ispit (SQL kodiranje nije nešto što se može “nabubati”), nego baš suprotno da ih podstakne da samostalnu sjednu i nad oglednim bazam sami sebi zadaju određene probleme (tj. upite). Svako programiranje pa tako i SQL nije ništa više nego trening i to sigurno 90%, talenat je 10 %. Međutim, treningom se može namiriti “manjak” talenta.

Svi upiti se rade kroz SQL Server okruženje (SSMS) i sample baze koje su prevljenje za ovu database platformu.

Šta nam je potrebno:

  1. SQL Server 2008 R2, 2008 ili 2005 (Denali je također u opciji)
  2. Sample baze podataka (u zavisnosti od verzije SQL Servera preuzmite odgovarajuće baze: http://msftdbprodsamples.codeplex.com/)
  3. Nekada koristim “stare” sample baze Northwind i Pubs. Iste se mogu preuzeti na :http://www.microsoft.com/download/en/details.aspx?id=23654)
  4. Ako niste nikada prije instalirali SQL Server imate moj video tutorijal koji to objašnjava http://www.youtube.com/watch?v=ahG4EF8G-3c
  5. Ako imate problema sa sample bazama podataka pogledajte ovdje: http://www.youtube.com/watch?v=xG258yGjLG0

Za početak sam odabrao prvi upit sa roka odražnog 06.09.2010. Teksta zadatka glasi ovako:

Baza podataka je: AdventureWorksLT

Za svaku kategoriju proizvoda, prikazati njoj pripadajuće proizvode i to sa sljedećim atributima (naziv kategorije, naziv proizvoda, cijenu proizvoda, boju, datum početka prodaje, datum kraja prodaje i veličinu proizvoda). Pored tražene liste atributa upit treba zadovljiti sljedeće kriterije:

  • Potrebno je kreirati novu kolonu koja će na osnovu početka i kraja prodaje prikazati ukupan broj dana u kojim se prikazani proizvod prodaje ili se prodavao;
    Uslovi ili filteri za upit su:
    • Naziv proizvoda počinje oznakom HL ili je broj dana prodaje veći ili jednak od 364 i prodaja proizvoda je završena
  • Izlaz ne smije imati sljedeće
    • U imenu proizvoda oznaku M
    • Cijenu manju od 1000

Rješenje je:

USE AdventureWorksLT
SELECT PC.Name, P.Name, P.ListPrice, P.Color, P.SellStartDate, P.SellEndDate,
DATEDIFF (DAY, P.SellStartDate, SellEndDate) AS 'Period prodaje',
P.Size

FROM SalesLT.ProductCategory AS PC
INNER JOIN SalesLT.Product AS P
ON PC.ProductCategoryID = P.ProductCategoryID

WHERE  (P.Name LIKE 'HL%' OR DATEDIFF (DAY, P.SellStartDate, SellEndDate) >= 364)
AND SellEndDate IS NOT NULL
AND (P.Name NOT LIKE '%M' AND P.ListPrice > 1000 )

ORDER BY P.Size DESC

Toliko za ovaj put.

END TRANSACTION
Advertisements

Written by Jasmin Azemović

08/09/2011 at 10:55

Posted in Database, FIT, SQL, TSQL

3 Responses

Subscribe to comments with RSS.

  1. Mala korekcija.
    Uslov ” P.Name NOT LIKE ‘%M’ ” nece zadovoljiti zahtjev da “Izlaz ne smije imati sljedeće…U imenu proizvoda oznaku M”.
    Sto se vidi i iz izlaza gore. ‘M’ountain-a na sve strane.

    Gore navedeni uslov daje u izlazu samo proizvode koji se NE ZAVRSAVAJU na ‘M’.
    Da ne bi u izlazu imali proizvode koji sadrze karakter ‘M’, procent simbol treba stajati S OBJE STRANE ‘M’.
    Tj.
    ” P.Name NOT LIKE ‘%M%’ ”

    No, onda u izlazu nece biti 29 proizvoda nego samo 13.

    Denis Salkic

    12/09/2011 at 14:37

    • Prije svega hvala na komentaru..znaci neko ovo ipak cita 🙂

      Vratimo se problem.
      Razmisljanje i logika su savim ok i pokazuju da kvantum znanja nije sporan. Međutim, ovo su sada cake. Da sam ja napisao…”u imenu prozvoda SLOVO M” onda bi Vaša opaska bila na mjestu.

      Radi se listama prozovda sa određenim oznakama.
      pokušajte zadnju liniju uslova staviti pod komentar:
      –AND (P.Name NOT LIKE ‘%M’ AND P.ListPrice > 1000 )
      sada je rezultat 98 zapisa.
      Ono što odmah bode oci jesu oznake u imenima prozvoda: XL, S, M…). Dakle oznaka u imenu, a ne slovo unutar naziva.
      Ovakvi problemi se rješavaju sempliranjem podataka prije samog upita. Recimo: SELECT TOP 100 *……
      Nadam se da sam pomogao.

      sqltales

      12/09/2011 at 16:36

  2. Rezultat od 29 zapisa ovdje diktira stavka o cijeni proizvoda. “P.Name NOT LIKE ‘%M’” pak radi jedno veliko nista u toj liniji.
    Moze komotno pisati i “P.Name NOT LIKE ‘%D’”ili bilo koji drugi karakter (osim 0, 2, 4, 6 i 8) – i nece biti razlike u izlazu.

    A trazi se vrlo jasno specificiran izlaz, uz ocito nejasno specificiran uslov(e).

    Da je trazena cijena neka druga (niza) ili da je nema uopste, ili da je karakter koji se trazi neki od brojeva gore – tako rijesen uslov bi bar imao funkcionalni razlog za postojanje.
    Tj. radio bi NESTO.

    No i dalje ne bi tehnicki radio ono sto je definisano u uslovu. Uslov trazi neku nedefinisanu oznaku M.
    Mozda je u pitanju oznaka velicine, mozda boja (magenta recimo), mozda vrsta materijala (magnesium recimo)…

    Da npr. postoji bilo koji unos koji ima “oznaku M” unesenu ispred, u sredini, ili bilo gdje drugo unutar stringa naziva – takav upit ne bi dao trazeni rezultat.

    Iz prostog razloga jer USLOV nije dobro definisan.
    Da je uslov definisan kao “U imenu proizvoda oznaku VELICINE M – koja se uvijek i iskljucivo (ne pitaj kako) nalazi na kraju stringa” – onda bi P.Name NOT LIKE ‘%M’ imalo smisla.

    Jer recimo npr. da je zadatak dio View-a ili Procedure-a koji ce se onda kasnije koristiti na “zivoj” bazi u koju se kontinuirano unose podatci.

    Prvi put kad neko umjesto ‘M’ na kraju naziva (ili negdje drugo u stringu naziva) upise ‘medium’, ‘m’, ‘med’, ‘Medium’, ‘MED’ itd. isl. – upit vise nece davati tacne podatke.
    Prvi put kada neko u neznanju (npr. neko je novoj sekretarici dao hrpu post-itsa sa novim proizvodima – pa da ih ukuca kad stigne) odluci da nesto drugo osim velicine oznaci sa ‘M’, ili ukuca sve sa ukljucenim CAPS LOCK – citava baza prestaje biti pouzdana.

    Jer originalno uslov nije bio dobro definisan, pa je upit skarabudzen da “kao radi nesto” (a gore ocito ne radi nista), pa stoji tu samo “da je veca kamara codea”.

    Denis Salkic

    13/09/2011 at 13:10


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: