U koly na procvic ení jazyka T-SQL

Podobné dokumenty
Osnova je orientační pro FIT, u FEKTu se dá předpokládat, že budou zohledněny předchozí znalosti studentů, kde většina s databází nikdy přímo

Základní přehled SQL příkazů

Databáze SQL SELECT. David Hoksza

Databázové systémy I

Úvod do databázových systémů 3. cvičení

Co bude výsledkem mého SELECTu? RNDr. David Gešvindr MVP: Data Platform MCSE: Data Platform MCSD: Windows Store MCT

Úvod do databázových systémů

Informační systémy ve zdravotnictví. 10. cvičení

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června krovacek@students.zcu.cz

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux

Databázové systémy a SQL

Databázové systémy II. KIV/DB2 LS 2007/2008. Zadání semestrální práce

Databáze 2011/2012 SQL SELECT II. RNDr.David Hoksza, Ph.D.

Obsah. SQL konstrukce select join Rekurze (rekurzivní with) Analytické funkce, group by Pivoting

KIV/ZIS cvičení 5. Tomáš Potužák

Databázové systémy. Cvičení 6: SQL

Informační systémy 2008/2009. Radim Farana. Obsah. Jazyk SQL

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

TEORIE ZPRACOVÁNÍ DAT Cvičení 8

Databázové systémy a SQL

Vzorové příklady SQL. Tabulka: Kniha CREATE TABLE kniha (id INTEGER, název VARCHAR(50), PRIMARY KEY (id))

RNDr. Jakub Lokoč, Ph.D. RNDr. Michal Kopecký, Ph.D. Katedra softwarového inženýrství Matematicko-Fyzikální fakulta Univerzita Karlova v Praze

Tabulka fotbalové ligy

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

Návrh a tvorba WWW stránek 1/14. PHP a databáze

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

Databázové systémy I

KIV/ZIS cvičení 6. Tomáš Potužák

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Databázové systémy Cvičení 5.2

Jazyk SQL 2. Michal Valenta. Katedra softwarového inženýrství FIT České vysoké učení technické v Praze c M.Valenta, 2011 BI-DBS, ZS 2011/12

SQL v14. 4D Developer konference. 4D Developer conference 2015 Prague, CZ Celebrating 30 years

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Jazyk SQL databáze SQLite. připravil ing. petr polách

Jaký je rozdíl v definicicíh VARCHAR2(20 BYTE) a VARCHAR2(20 CHAR):

Stored Procedures & Database Triggers, Tiskové sestavy v Oracle Reports

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Mechanismus obarvení řádků browse

6. SQL složitější dotazy, QBE

Úvod do SQL v systému SAS Martin Branda

XMW4 / IW4 Pokročilé SELECT dotazy. Štefan Pataky

PG 9.5 novinky ve vývoji aplikací

Úvod do databázových systémů

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE

Úvod do databázových systémů

Úvod do databází. Modelování v řízení. Ing. Petr Kalčev

Materiál ke cvičením - SQL

KIV/ZIS - SQL dotazy. stáhnout soubor ZIS- 04_TestovaciDatabaze accdb. SQL dotazy. budeme probírat pouze SELECT

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

MS Access Dotazy SQL

Jazyk S Q L základy, příkazy pro práci s daty

Databázové systémy Cvičení 5.3

Semestrální práce z DAS2 a WWW

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata

JAK KOMUNIKOVAT S DATABÁZÍ PostGIS TUTORIAL

KIV/ZIS - SELECT, opakování

6. blok část B Vnořené dotazy

NÁVRH A TVORBA HUDEBNÍ DATABÁZE

MySQL. mysql> CREATE DATABASE nova CHARACTER SET latin2 COLLATE latin2_czech_cs; Query OK, 1 row affected (0.02 sec)

RNDr. Michal Kopecký, Ph.D. Department of Software Engineering, Faculty of Mathematics and Physics, Charles University in Prague

DOKUMENTACE. Úvod do zpracování prostorových dat (153UZPD) PROJEKT

Operátory ROLLUP a CUBE

Databáze I. Přednáška 4

Vkládání, aktualizace, mazání

Jazyk SQL slajdy k přednášce NDBI001

FAKULTA STAVEBNÍ STUDIJNÍ PROGRAM: GEODÉZIE A KARTOGRAFIE TYP PROGRAMU: MAGISTERSKÝ STUDIJNÍ OBOR: GEOMATIKA ÚVOD DO ZPRACOVÁNÍ PROSTOROVÝCH DAT

Virtual private database. Antonín Steinhauser

Databáze 2011/2012 T-SQL - kurzory, funkce. RNDr.David Hoksza, Ph.D.

Informační systémy ve zdravotnictví. 8. cvičení

Databázové systémy Cvičení 5

Multi-dimensional expressions

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

SPŠS Č.Budějovice Obor Geodézie a Katastr nemovitostí 3.ročník ATRIBUTY ZÁKLADN POJMY VÝBĚR PRVKŮ DLE ATRIBUTŮ

Internetová filmová databáze IFDB

SQL. strukturovaný dotazovací jazyk. Structured Query Language (SQL)

Marian Kamenický. Syntea software group a.s. marian.kamenicky. MFFUK Praha 2012/13

Dotazy v SQL. Výraz relační algebry R1( )[A1,A2,...,Aj] lze zapsat takto: SELECT A1,A2,...,Aj FROM R1 WHERE. Výraz (R1, R2... Rk)( )[A1,A2,...

Úvod do databázových systémů

7. Integrita a bezpečnost dat v DBS

7. Integrita a bezpečnost dat v DBS

MySQL manuál. Copyright: Adam Jun Stránky manuálu:

Databázové systémy. Dotazovací jazyk SQL - III

Kapitola 4: SQL. Základní struktura

Uložené procedury Úvod ulehčit správu zabezpečení rychleji

Inovace a zkvalitnění výuky prostřednictvím ICT. Základní seznámení s MySQL Ing. Kotásek Jaroslav

Univerzita Pardubice. Fakulta elektrotechniky a informatiky SEMESTRÁLNÍ PRÁCE PRO PŘEDMĚT IDAS2

SQL injection jak ji možná neznáte Roman Kümmel

- sloupcové integritní omezení

Úvod do databázových systémů

Databáze 2011/2012 SQL DDL (CREATE/ALTER/DROP TABLE), DML (INSERT/UPDATE/DELETE) RNDr.David Hoksza, Ph.D.

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Databáze I. Přednáška 6

Instalace. Produkt je odzkoušen pro MS SQL server 2008 a Windows XP a Windows 7. Pro jiné verze SQL server a Windows nebyl testován.

Databáze I. Přednáška 7

WORD. 4. Texty vyskytují se v dokumentu 3x mají zelenou barvu

Informační systémy 2008/2009. Radim Farana. Obsah. Skripty a dávky. Nastavení aktuální databáze. USE DatabaseName

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Řešené příklady STUDENT(RČ, JMÉNO, SPECIALIZACE) PŘEDMĚT(KÓD, NÁZEV, SYLLABUS, GARANT) ZÁPIS(RČ, KÓD, SEMESTR, ZNÁMKA)

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava

Transkript:

U koly na procvic ení jazyka T-SQL Lehké Úkol 1 Vytvořte seznam všech zákazníků, seřazený vzestupně podle jména a druhotně podle příjmení. Vraťte všechny sloupce tabulky. SELECT * ORDER BY FirstName, LastName Zadání B Vytvořte seznam všech zákazníků, seřazený vzestupně podle jména a druhotně podle příjmení. Vraťte jen sloupce Title, FirstName, LastName, Suffix a ContactID. SELECT ContactID, Title, FirstName, LastName, Suffix ORDER BY FirstName, LastName Vytvořte seznam všech zákazníků kteří mají titul před jménem i za jménem, seřazený sestupně podle jména a druhotně podle příjmení. Vraťte jen sloupce Title, FirstName, LastName, Suffix a ContactID. SELECT ContactID, Title, FirstName, LastName, Suffix WHERE Title IS NOT NULL AND Suffix IS NOT NULL ORDER BY FirstName DESC, LastName DESC Zadání D Vytvořte seznam všech zákazníků jejichž titul před jménem začíná na písmeno M, seřazený sestupně podle jména a druhotně vzestupně podle příjmení. Vraťte jen sloupce Title, FirstName, LastName, Suffix a ContactID. SELECT ContactID, Title, FirstName, LastName, Suffix WHERE Title LIKE 'M%' ORDER BY FirstName DESC, LastName Zadání E Vytvořte seznam zákazníků, který bude obsahovat všechny zákazníky, ale vraťte jen sloupce ContactID a PersonName, kde sloupec PersonName bude dopočítaný do následující podoby: Ing. Petr Novák, PhD. {Title} {FirstName} {LastName}, {Suffix} Využijte funkce COALESCE pro ošetření nullových hodnot. SELECT ContactID, COALESCE(Title+' ','') + FirstName + ' ' + LastName + COALESCE(', ' + Suffix, '') PersonName

Person.Contact Úkol 2 Vytvořte seznam produktů které bylo možno koupit od 1. 1. 2000 do 1. 1. 2001. SELECT * FROM Production.Product WHERE SellStartDate <= '2000/1/1' AND (SellEndDate >= '2001/1/1' OR SellEndDate IS NULL) Zadání B Vytvořte parametrizovanou uloženou proceduru Production.uspGetAvailableProducts, která umožní vracet seznam prodávaných produktů v daných mezích dat. CREATE PROCEDURE Production.uspGetAvailableProducts @SellFrom DATETIME, @SellTo DATETIME BEGIN SELECT * FROM Production.Product WHERE SellStartDate <= @SellFrom AND (SellEndDate >= @SellTo OR SellEndDate IS NULL) END Vytvořte pohled Production.vAvailableProducts který bude vracet produkty, které se v současné chvíli prodávají. Využijte GETDATE pro získání aktuálního data a času. CREATE VIEW Production.vAvailableProducts SELECT * FROM Production.Product WHERE SellStartDate <= GETDATE() AND (SellEndDate >= GETDATE() OR SellEndDate IS NULL) Zadání D Určete pro každý produkt celkovou délku jak dlouho je na trhu, počítáno ve dnech. Využijte funkce DATEDIFF. Nezapomeňte ošetřit situaci, kdy produkt je na trhu až do současnosti např. využitím CE. SELECT ProductID, Name, CE WHEN SellEndDate IS NULL THEN DATEDIFF(d, SellStartDate, GETDATE()) ELSE DATEDIFF(d, SellStartDate, SellEndDate) END AtMarketPeriod FROM Production.Product Production.Product

Středně těžké Úkol 3 Určete, která 3 jména jsou mezi zákazníky nejčastěji používána. Vypište také počet jejich užití. SELECT TOP 3 FirstName, COUNT(*) UsedTimes GROUP BY FirstName ORDER BY COUNT(*) DESC Zadání B Určete, která 3 mužská jména jsou mezi zákazníky nejčetnější. Vypište také počet jejich užití. SELECT TOP 3 FirstName, COUNT(*) UsedTimes WHERE Title = 'Mr.' GROUP BY FirstName ORDER BY COUNT(*) DESC Vytvořte uloženou proceduru Person.uspGetFirstNameUsage, která bude po zadání jména vracet počet jeho výskytů a relitivní počet jeho výstytů vzhledem k celkovému počtu jmen (v %, zaokrouhleno na 4 desetinná místa). CREATE PROCEDURE Person.uspGetFirstNameUsage @FirstName nvarchar(50) BEGIN SELECT TOP 3 FirstName, COUNT(*) UsedTimes, ROUND(CT(COUNT(*) FLOAT)/(SELECT COUNT(FirstName) FROM Person.Contact)*100,4) [Relative] WHERE FirstName = @FirstName GROUP BY FirstName END Zadání D Určete počet různých jmen, která byla u zákazníků použita. SELECT COUNT(DISTINCT FirstName) UsedNames Person.Contact

Úkol 4 Určete, kterých 10 zákazníků naposledy nakupovalo. Využijte propojení tabulek Sales.SalesOrderHeader, Sales.Individual a Person.Contact. Vypište jen základní údaje o zákazníkovi. SELECT TOP 10 c.* c INNER JOIN Sales.SalesOrderHeader soh ON c.contactid = soh.contactid ORDER BY soh.orderdate DESC Zadání B Vytvořte pohled Sales.vBestCustomers, který bude zobrazovat 10 nejvíce nakupujících zákazníků (uvažujme podle ceny objednávky). CREATE VIEW Sales.vBestCustomers SELECT TOP 10 c.contactid, c.firstname, c.lastname, SUM(TotalDue) TotalDue c INNER JOIN Sales.SalesOrderHeader soh ON c.contactid = soh.contactid GROUP BY c.contactid, c.firstname, c.lastname ORDER BY SUM(TotalDue) DESC Vytvořte pohled Sales.vMostActiveCustomers, který bude zobrazovat 10 nejvíce nakupujících zákazníků (uvažujme podle počtu objednávek). CREATE VIEW Sales.vMostActiveCustomers SELECT TOP 10 c.contactid, c.firstname, c.lastname, COUNT(*) TotalOrders c INNER JOIN Sales.SalesOrderHeader soh ON c.contactid = soh.contactid GROUP BY c.contactid, c.firstname, c.lastname ORDER BY COUNT(*) DESC Sales.SalesOrderHeader, Sales.Individual a Person.Contact Těžké Úkol 5 Tabulka Purchasing.PurchaseOrderHeader obsahuje informace o nákupech zboží, které je potom přeprodáváno. Spočítejte průměrnou nákupní cenu za kus pro jednotlivé produkty, které byly nakoupeny. Využijte dat z tabulky Purchasing.PurchaseOrderDetail. SELECT p.name, AVG(pod.UnitPrice) AverageUnitPrice INNER JOIN Production.Product p ON pod.productid = p.productid GROUP BY pod.productid, p.name

Zadání B Pomocí tabulky Production.Product určete, které produkty jsou vlastní výroby (neexistuje pro ně záznam v Purchasing.PurchaseOrderDetail). Využijte v podmínce EXISTS. SELECT * FROM Production.Product p WHERE NOT EXISTS (SELECT * WHERE pod.productid = p.productid) Pomocí tabulky Production.Product určete, které produkty nejsou vlastní výroby (existuje pro ně záznam v Purchasing.PurchaseOrderDetail). Využijte v podmínce EXISTS. SELECT * FROM Production.Product p WHERE EXISTS (SELECT * WHERE pod.productid = p.productid) Zadání D Pro každý nakoupený produkt spočítejte průměrnou nákupní cenu (Purchasing.PurchaseOrderDetail). SELECT p.name, AVG(pod.UnitPrice) AverageUnitPrice INNER JOIN Production.Product p ON pod.productid = p.productid GROUP BY pod.productid, p.name Zadání E Vytvořte pohled Purchasing.vPurchasedProducts, který bude obsahovat sloupce ProductID a vypočítaný sloupec UnitPrice, který bude obsahovat průměrnou nákupní cenu. CREATE VIEW Purchasing.vPurchasedProducts SELECT ProductID, AVG(UnitPrice) AverageUnitPrice FROM Purchasing.PurchaseOrderDetail GROUP BY ProductID Zadání F Určete pro každou objednávku ze Sales.SalesOrderHeader, kolik se prodělalo nebo vydělalo na přeprodání nakoupených dílů. SELECT soh.salesorderid, SUM((sod.UnitPrice-AverageUnitPrice)*sod.OrderQty) Incomes FROM Sales.SalesOrderHeader soh INNER JOIN Sales.SalesOrderDetail sod ON soh.salesorderid = sod.salesorderid INNER JOIN Purchasing.vPurchasedProducts pp ON sod.productid = pp.productid GROUP BY soh.salesorderid

Zadání G Upravte pohled Purchasing.vPurchasedProducts tak, aby byl rozšířen o jeden sloupec, kde budou pomocí Sales.SalesOrderDetail vypočítány zisky nebo ztráty na prodeji daného produktu. ALTER VIEW Purchasing.vPurchasedProducts SELECT ProductID, AVG(pod.UnitPrice) AverageUnitPrice, (SELECT SUM((sod.UnitPrice-pod2.AverageUnitPrice)*sod.OrderQty) FROM Sales.SalesOrderDetail sod INNER JOIN (SELECT ProductID, AVG(pod.UnitPrice) AverageUnitPrice GROUP BY ProductID) pod2 ON pod2.productid = sod.productid WHERE sod.productid = pod.productid) Incomes GROUP BY ProductID ORDER BY ProductID Zadání H Vytvořte uloženou proceduru, která má parametr ProductID a vrací informace o ziscích či ztrátách na prodeji nakupovaného produktu. CREATE PROCEDURE Production.uspProductIncomes @ProductID int BEGIN SELECT ProductID, AVG(pod.UnitPrice) AverageUnitPrice, (SELECT SUM((sod.UnitPrice-pod2.AverageUnitPrice)*sod.OrderQty) FROM Sales.SalesOrderDetail sod INNER JOIN (SELECT ProductID, AVG(pod.UnitPrice) AverageUnitPrice GROUP BY ProductID) pod2 ON pod2.productid = sod.productid WHERE sod.productid = pod.productid) Incomes WHERE pod.productid = @ProductID GROUP BY ProductID ORDER BY ProductID END Purchasing.PurchaseOrderDetail, Sales.SalesOrderHeader, Sales.SalesOrderDetail, Production.Product Úkol 6 Určete kolik objednávek vystavili jednotliví obchodníci v Sales.SalesPerson SELECT sp.salespersonid, COUNT(*) OrderCount FROM Sales.SalesPerson sp INNER JOIN Sales.SalesOrderHeader soh ON sp.salespersonid = soh.salespersonid GROUP BY sp.salespersonid

Zadání B Určete celkovou cenu zboží co prodali jednotliví obchodníci, pro zjednodušení počítejte se sloupcem TotalDue v rámci Sales.SalesOrderHeader. SELECT sp.salespersonid, SUM(soh.TotalDue) TotalSales FROM Sales.SalesPerson sp INNER JOIN Sales.SalesOrderHeader soh ON sp.salespersonid = soh.salespersonid GROUP BY sp.salespersonid Určete nejlepšího prodejce pro každou oblast, ve výsledku vypište ID prodejce, název oblasti a celkovou sumu prodejů. CREATE FUNCTION Sales.udfGetBestTerritorySalesPerson ( @TerritoryID int ) RETURNS TABLE RETURN ( SELECT TOP 1 sp.salespersonid, SUM(soh.TotalDue) SalesPersonTotalDue FROM Sales.SalesPerson sp INNER JOIN Sales.SalesOrderHeader soh ON sp.salespersonid = soh.salespersonid AND sp.territoryid = soh.territoryid WHERE soh.territoryid = @TerritoryID GROUP BY sp.salespersonid ORDER BY SUM(soh.TotalDue) DESC ) GO SELECT st.territoryid, ts.* FROM Sales.SalesTerritory st OUTER APPLY Sales.udfGetBestTerritorySalesPerson(st.TerritoryID) ts ORDER BY TerritoryID

Zadání D Každý obchodník má stanovený limit, kolik zboží musí prodat za rok, aby dostal k výplatě bonusy. Protože se tento limit mění s časem, tak je uchováván v závislosti na roce v tabulce Sales.PersonQuotaHistory. Vytvořte uloženou proceduru Sales.uspRewardedSalesPersons, která po vložení roku (jako číslo) vypíše obchodníky, kteří v daném roce získali svůj bonus. CREATE PROCEDURE Sales.uspRewardedSalesPersons @Year int BEGIN SELECT * FROM ( SELECT spqh.salespersonid, (SELECT SUM(TotalDue) RealSales FROM Sales.SalesOrderHeader soh WHERE soh.salespersonid = spqh.salespersonid AND soh.orderdate > spqh.quotadate AND soh.orderdate < DATEADD(m,3,spqh.QuotaDate) ) RealSales, spqh.salesquota FROM Sales.SalesPersonQuotaHistory spqh WHERE spqh.quotadate >= CT(CT(@Year nvarchar(4))+'/1/1' DATE) AND spqh.quotadate <= CT (CT(@Year nvarchar(4))+'/12/31' DATE) ) sales WHERE sales.realsales >= sales.salesquota END Sales.SalesPerson, Sales.SalesPersonQuotaHistory, Sales.SalesOrderHeader, Sales.Territory