-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathFunctions.sql
More file actions
161 lines (127 loc) · 4.35 KB
/
Copy pathFunctions.sql
File metadata and controls
161 lines (127 loc) · 4.35 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
-----------------------------------------------------------------------------------------------
--------------------------------Scalar Functions ----------------------------------------------
-----------------------------------------------------------------------------------------------
IF EXISTS (SELECT 1 FROM sys.objects WHERE NAME = 'fnShowMaxTransaction')
DROP FUNCTION fnShowMaxTransaction
GO
CREATE FUNCTION fnShowMaxTransaction
(
@PersonID int
)
RETURNS smallmoney
AS
BEGIN
IF EXISTS (SELECT 1 FROM Person WHERE PersonID = @PersonID)
DECLARE @MaxTran smallmoney
SELECT @MaxTran = MAX(Amount) FROM Person P
JOIN Transactions T
ON P.PersonID = T.PersonID
WHERE P.PersonID = @PersonID
Return @MaxTran
END
GO
--Function in the Select Clause are very efficient
SELECT PersonName,dbo.fnShowMaxTransaction(PersonID) FROM Person
GO
--Return the Differenc Between the OverallMaxTransaction and Each Person's Max
IF EXISTS (SELECT 1 FROM sys.objects WHERE NAME = 'fnShowHowFarFromMax')
DROP FUNCTION fnShowHowFarFromMax
GO
CREATE FUNCTION fnShowHowFarFromMax
(
@PersonID int
)
RETURNS smallmoney
AS
BEGIN
IF EXISTS (SELECT 1 FROM Person WHERE PersonID = @PersonID)
DECLARE @MaxTran smallmoney
;WITH MAxOverall AS
(SELECT P.PersonID,MAX(Amount) OVER() AS MaxTransaction FROM Person P
JOIN Transactions T
ON P.PersonID = T.PersonID )
SELECT @MaxTran = MaxTransaction -MAX(Amount) FROM Person P
JOIN Transactions T
ON P.PersonID = T.PersonID
JOIN MAxOverall M
ON P.PersonID = M.PersonID
WHERE P.PersonID = @PersonID
GROUP BY MaxTransaction
Return @MaxTran
END
GO
SELECT PersonName,dbo.fnShowHowFarFromMax(PersonID) FROM Person
GO
-----------------------------------------------------------------------------------------------
--------------------------------Inline Table Functions ----------------------------------------
-----------------------------------------------------------------------------------------------
--Return Transaction History For Each Employee
IF EXISTS (SELECT 1 FROM sys.objects WHERE NAME = 'fnPersonTransactions')
DROP FUNCTION fnPersonTransactions
GO
CREATE FUNCTION dbo.fnPersonTransactions
(@PersonID int)
RETURNS TABLE AS RETURN
(
SELECT P.PersonID,PersonName,Email,Amount,TransactionDate FROM Person P
JOIN Transactions T
ON P.PersonID = @PersonID
)
GO
SELECT * FROM dbo.fnPersonTransactions(20)
WHERE Amount > 500 and Amount < 600 AND TransactionDate BETWEEN '20120101' AND '20150101'
ORDER BY TransactionDate
GO
IF EXISTS (SELECT 1 FROM sys.objects WHERE NAME = 'fnWhoHasHigherTransactionsThanMe')
DROP FUNCTION fnWhoHasHigherTransactionsThanMe
GO
CREATE FUNCTION dbo.fnWhoHasHigherTransactionsThanMe
(@PersonID int)
RETURNS TABLE AS RETURN
(
SELECT P.PersonID,PersonName,Email,Amount,TransactionDate FROM Person P
JOIN Transactions T
ON P.PersonID = T.PersonID
WHERE Amount > (SELECT MAX(Amount) FROM Person P1 join Transactions T1 ON P1.PersonID = T1.PersonID
WHERE P1.PersonID = @PersonID)
)
GO
SELECT * FROM dbo.fnWhoHasHigherTransactionsThanMe(150)
GO
-----------------------------------------------------------------------------------------------
--------------------------------MultiStatement Table Functions --------------------------------
-----------------------------------------------------------------------------------------------
IF EXISTS (SELECT 1 FROM sys.objects WHERE NAME = 'fnGetPersonTransactions')
DROP FUNCTION fnGetPersonTransactions
GO
CREATE FUNCTION fnGetPersonTransactions(@PersonID int)
RETURNS @Tranlist TABLE
(
PersonID int,
PersonName nvarchar(50),
Email varchar(100),
Amount smallmoney,
TransactionDate date
)
AS
BEGIN
IF @PersonID IN (5,15,25,45,55,75,85,95,115,125)
BEGIN
INSERT INTO @TranList(PersonID,[PersonName],[Email])
SELECT PersonID,[PersonName],[Email] FROM Person
WHERE PersonID = @PersonID
END
ELSE
BEGIN
INSERT INTO @TranList(PersonID,[PersonName],[Email],Amount,TransactionDate)
SELECT P.PersonID,[PersonName],[Email],Amount,TransactionDate FROM Person P
JOIN Transactions T
ON P.PersonID = T.PersonID
WHERE P.PersonID = @PersonID
END
RETURN
END
GO
SELECT * FROM dbo.fnGetPersonTransactions(5)
--outer apply = left join
--cross apply = inner join