Warto mieć książkę w PDF.
W przypadku uczenia się SQL nie trzeba przepisywać kwerend z książki.
Tylko kopiuj i wklej oraz EXECUTE i widać efekt.
Nie przepadam za elektroniczną lekturą ale tu warto zrobić wyjątek.
Polecam książkę do nauki SQL na MS Server:
MS SQL Server. Zaawansowane metody programowania.
Autor: Adam Pelikant
Do kupienia w HELION, pierwsza linka.
Pod drugą linką przygotowałem slajdy jak podczepić pod serwer przykładową do książki bazę i jak z niej korzystać na zasadzie kopiuj i wklej.
http://helion.pl/ksiazki/ms-sql-server-zaawansowane-metody-programowania-adam-pelikant,sqlszm.htm
https://drive.google.com/file/d/0B0DNBH1DOPAfT05BT0ZpTVRvRGc/view?usp=sharing
select count (*) from tabelka; -- 7, czy 5 a może 3?
Podstawowa, najczęściej używana funkcja agregująca to zliczanie rekordów w
wyniku zapytania, w tabeli.
A zliczyć można na co najmniej na trzy sposoby (te znam), wszystkie
rekordy, analizując zawartość określonego pola i policzyć tylko te co nie są
NULL, a jeszcze można nie są NULL I tylko unikalne wystąpienia.
Do przećwiczenia kod pod linką plus
obrazek.
Zobacz dlaczego wyniki są różne.
select count (*) from tabelka; -- wynik 7
select count (nazwisko) from tabelka; -- wynik 5
select count (distinct nazwisko) from tabelka; -- wynik 3
EXCEL: wyszukaj pionowo…
SQL i EXCEL to niejako rewers i awers.
Z różnych możliwości dzisiaj Marcinie patent na łączenie
danych.
Kto wymyślił coś takiego, nie mam pojęcia, ale pewno musiał
dostawać różne tabelki i szybko je łączyć, robić z danych wydruki, korespondencję seryjną, to wymyślił
WYSZUKAJ PIONOWO.
I obrazek oraz plik excel pokazują jak to działa.
Należy wskazać w nawiasie:
- w zestawieniu 1 pole, które zawiera wartość szukaną w zestawieniu 2 (musi być w pierwszym polu zestawienia 2),
- następnie definicja całego zestawienia 2 poprzez wskazanie narożników obszaru (lewy górny róg : prawy dolny róg)
- teraz z którego pola zestawienia 2 ma się pobrać wartość co przedłużonego zestawienia 1,
- fałsz, ta klauzula jest ważna, ponieważ tylko dokładne dopasowania są brane pod uwagę, jeżeli nie ma tej klauzuli, to różne podobne będą podkładane, nie polecam.
I jest, i od razu widać, że w zestawieniu 2 nie ma danych
dla umowy o ID A103. Nie wszystko musi być przy pomocy SQL. Nie próbuj Marcinie
otwierać drzwi kwerendą, prościej wstać i tradycyjnie to zrobić.
Jak używamy operator IN, jak to zadziała fajnie na Oracle, a jak nie na MS SQL...
Operator IN przydaje się, jak nie szukamy jednego
konkretnego rekordu, ale wielu, których pewna wartość jest w zbiorze. Na
przykład: znajdź wszystkie produkty w sklepie, które są marki, sony lub iphone.
Select * from produkty where
marka in ('sony' , 'iphone') ;
Właśnie dlatego, że więcej niż jednego producenta, to trzeba
użyć operatora IN i w nawiasach podać listę wartości. Na bazie ORACLE lista
może być, jak to powiedzieć: dwupolowa, a nawet więcej polowa. Gdybyśmy chcieli
znaleźć najdroższe produkty wyżej wymienionych marek, to można to uzyskać w
następujący sposób.
Select * from produkty
where (marka, cena)
in
(select marka, max(cena)
from produkty
where marka in ('sony' , 'iphone') group by marka ) ;
Ten drugi patent nie zadziała na MS SQL Serwerze. To zatem
jak? Pokazuję na przykładzie tabeli z cenami mieszkań, w latach, kwartałach,
miastach, dane z: https://www.nbp.pl/publikacje/rynek_nieruchomosci/ceny_mieszkan.xls
I chcę wydobyć dane o mieście, roku, kwartale dla każdego maksa
w danym roku.
W tej lokalizacji jest plik do załadowania danych oraz plik
z rozwiązaniem ww. problemu.
Jak wynik zapisać w nowej tabeli na MS SQL Serverze.
Marcinie,
Nieco cicho siedzę, bo zmieniłem orientację… na MS SQL
Server. System bazodanowy ORACLE mnie porzucił, stąd zmiana.
I jak każdy widzi, oczywista oczywistość, wynik zapytania,
to jak nie spojrzeć to tabela. Wynik można sobie skopiować i zapisać, ale jak
to zapisać na bazie, jako nowa tabela? Bo to się opłaca, jeżeli się chce często
sięgać do wyniku, a jego pozyskanie jest czasochłonne i nie wymaga częstej
aktualizacji.
W ORACLE jest moim zdaniem intuicyjnie, bardzo blisko
sposobu tworzenia tabeli, trzeba tak:
CREATE TABLE nowa_tabela as SELECT….
I ten nasz wynik zapytania będzie w nowej tabeli i tyle,
takie proste. Tak to nie działa na MS SQL Serverze :-)
Trzeba sobie napisać:
SELECT ………….. INTO NOWA_TABELA FROM ……..
Czyli wybierz do nowej tabeli z .... Pomino, że definiowanie tabel działa tak samo jak na
Oracle.
Sprawdziłem to zadziałało. Obrazki to dowodzą.
Pozdrawiam,
W.
CASE – WYSYŁKA OFERTY PRENUMERATY, POST NR 5
Marcinie,
Nad użyciem słowa "case" w tytule ubolewam, taka refleksja
na początek. Jednak stało się, trudno, z tym trzeba żyć, przy okazji może
poprawię na "przykład".
Znowu "tylko" będzie. Dzisiaj wklejam kwerendę, bardzo
krótka, ale jej wynik przeklejam do excel i bawię się tabelą przestawną, mam
już całkiem spore możliwości badania problemu skuteczności wysyłek. Polecam przeklinać
udostępniony arkusz w excel. Jakie "czary" można uzyskać widać na obrazkach.
Szersze opisy będą wkrótce :-)
Szersze opisy będą wkrótce :-)
Kwerenda:
select
dn_od_wysylki
, plec
, wojewodztwo
, sum(zn_prenumeraty_kum)
prenumeraty_skum
, convert(int, sum (zlicz) ) l_obserwacji
from KOSTKA
group by
dn_od_wysylki
, plec
, wojewodztwo
order by 1
;
Linka do arkusza z tabelą przestawną:
Subskrybuj:
Posty (Atom)
