Repository navigation
Expand file tree
/
Copy path25_SQL_Views.sql
More file actions
199 lines (163 loc) · 5.1 KB
/
Copy path25_SQL_Views.sql
File metadata and controls
199 lines (163 loc) · 5.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
-----------------SQL Views-----------------
/*
Views to wirtualna tabele oparta na wyniku zapytania, bez przechowywania danych w bazie danych.
Nie mozna do nich nic dopisac bo to tylko widoki ale mozna je zmieniac duzo latwiej niz tabele.
Querying views zawsze jest wolniejsze bo baza danych musi wykonac tez zapytanie z widoku, a nie tylko
z tabeli. Widoki to wirtualny layer a tabale to fizyczny layer.
Widoki to zapisane na stale zapytanie SQL w bazie danych.
SYNTAX:
CREATE VIEW View-Name AS
(
SELECT...
FROM...
WHERE...
)
*/
------USE CASE: Central Query Logic------
/*
Przechowuje centralna, skomplikowana logike zapytania w bazie danych
do dostepu przez wiele zapytan, co ogranicza zlozonosc projektu.
*/
/*task: Find the running total of sales for each month*/
SELECT
OrderID,
OrderDate,
DATENAME(MONTH,OrderDate) [miesiace],
SUM(Sales) OVER(PARTITION BY DATENAME(MONTH,OrderDate) ORDER BY OrderDate ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) [running total]
FROM Sales.Orders
ORDER BY OrderDate ASC;
--rozw barry
WITH CTE_Monthly_Summary AS
(
SELECT
DATETRUNC(month,OrderDate) OrderMonth,
SUM(Sales) TotalSales,
COUNT(OrderID) TotalOrders,
SUM(Quantity) TotalQuntities
FROM Sales.Orders
GROUP BY DATETRUNC(month,OrderDate)
)
SELECT
OrderMonth,
TotalSales,
SUM(TotalSales) OVER(ORDER BY OrderMonth) AS [RunningTotal]
FROM CTE_Monthly_Summary;
--------utworzono view w innym zapytniu (patrz nizej)
SELECT*
FROM Sales.V_Monthly_Summary
--NOTE: jesli tworzymy tabele albo widok bez okreslonego schematu,
-- to domyslnie bedzie to dbo.
SELECT
OrderMonth,
TotalSales,
SUM(TotalSales) OVER(ORDER BY OrderMonth) AS [RunningTotal]
FROM Sales.V_Monthly_Summary;
-------------------------------------------------------------------------------------------
DROP VIEW Sales.V_Monthly_Summary
IF OBJECT_ID ('Sales.V_Monthly_Summary', 'V') IS NOT NULL
DROP VIEW Sales.V_Monthly_Summary;
GO
CREATE VIEW Sales.V_Monthly_Summary AS
(
SELECT
DATETRUNC(month,OrderDate) OrderMonth,
SUM(Sales) TotalSales,
COUNT(OrderID) TotalOrders
FROM Sales.Orders
GROUP BY DATETRUNC(month,OrderDate)
)
GO
DROP VIEW dbo.V_Monthly_Summary
--NOTE: W postgresie mozna uzyc komendy CREATE OR REPLACE jak chcemy zupdatowac view
/*
Jesli chcemy zmienic view to mozemy zrobic drop view, create view od nowa,
a jesli nie to uzyjemy T-SQL.
Transact-SQL to rozszerzenie SQL ktore dodaje programistyczna funkcjonalnosc.
*/
---------------------------------------------------------------------------------------------
----USE CASE 2: Hide complexity-----
/*
Widoki moga byc uzywane by ukryc zlozonosc tabel w bazie danych i oferuja
uzytkownikom bardziej przyjazne i prostsze do zrozumienia obiekty.
*/
/*task: Provide a view that combines details from orders, products,customers
and employees*/
GO
CREATE VIEW Sales.V_Order_Details AS
(
SELECT
o.OrderID,
o.OrderDate,
p.Product,
p.Category,
CONCAT(ISNULL(c.FirstName,''),' ',ISNULL(c.LastName,'')) [customerName],
c.Country [kraj],
CONCAT(ISNULL(e.FirstName,''),' ',ISNULL(e.LastName,'')) [employeeName],
e.Department,
o.Sales,
o.Quantity
FROM Sales.Orders as o
LEFT JOIN Sales.Products as p
ON o.ProductID = p.ProductID
LEFT JOIN Sales.Customers as c
ON o.CustomerID = c.CustomerID
LEFT JOIN Sales.Employees as e
ON o.SalesPersonID = e.EmployeeID
)
GO
----------------------------------------------------------------------------------
SELECT*
FROM Sales.V_Order_Details
------------USE CASE: Data Security-----------
/*
Uzywaj widokow aby wymusic bezpieczenstwo i ochronic dane wrazliwe
przez ukrywanie kolumn i/lub wiersz z tabel.
*/
/*task: Provide a view for the EU Sales Team that combines details from
all tables and excludes data related to the USA*/
--------------------------------------------------------------------------------------
IF OBJECT_ID ('Sales.V_EU_Sales_Data','V') IS NOT NULL
DROP VIEW Sales.V_EU_Sales_Data
GO
CREATE VIEW Sales.V_EU_Sales_Data AS
(
SELECT
o.OrderID,
o.OrderDate,
p.Product,
p.Category,
CONCAT(ISNULL(c.FirstName,''),' ',ISNULL(c.LastName,'')) [customerName],
c.Country [kraj],
CONCAT(ISNULL(e.FirstName,''),' ',ISNULL(e.LastName,'')) [employeeName],
o.Sales,
o.Quantity
FROM Sales.Orders as o
LEFT JOIN Sales.Products as p
ON o.ProductID = p.ProductID
LEFT JOIN Sales.Customers as c
ON o.CustomerID = c.CustomerID
LEFT JOIN Sales.Employees as e
ON o.SalesPersonID = e.EmployeeID
WHERE c.Country != 'USA'
)
GO
DROP VIEW dbo.V_EU_Sales_Data
---------------------------------------------------------------------------------------
-------USE CASE: Flexibility and Dynamic-------
/*
Widoki daja nam swobode editowania tabel i zmiania ich bez potrzeby
by inne osoby uczyly sie na nowo naszych nowych nazw i struktur tabel.
*/
------USE CASE: Multiple Languages-------
/*
Dzieki widokom mozemy pokazywac nazwy kolumn, tabel w innych jezykach,
dla partnerow miedzynarodowych.
*/
------USE CASE: Virtual Data Marts in DWH-------
/*
Widoki mogą służyć jako hurtownie tematyczne (Data Marts) w systemie hurtowni danych,
ponieważ zapewniają elastyczny i wydajny sposób prezentowania danych.
Chodzi o to aby miec fizyczne dane w jednym miejscu i zbudowac nad nimi
poziom wirtualny (widoki).
*/