Anda di halaman 1dari 35

Computer Laboratory Handbook

Chatrine Sylvia, Catherine Database Data & Information Mngt

Praktik Manajemen
Data dan Informasi
SI0040

Participant Handbook
Course Version: 2018 V 1.0
Information System Program, Copyright ©2018
Chatrine Sylvia, Catherine Database Data & Information Mngt

UNIT 5
TRANSACT-SQL (LANJUTAN)

UNIT OVERVIEW
Unit ini akan membahas tentang pernyataan T-SQL tingkat lebih lanjut dimana mahasiswa akan
mempelajari mengenai operator JOIN, penggunaan deklarasi variabel, penggunaan fungsi tanggal
untuk memanipulasi tanggal dan waktu, fungsi CAST dan CONVERT untuk kegiatan konversi data,
manipulasi nilai string, penggunaan fungsi built-in, penggunaan query PIVOT, UNPIVOT, paging,
langkah-langkah menangani kesalahan T-SQL, serta keyword untuk pengontrolan aliran.

UNIT OBJECTIVES
Setelah menyelesaikan unit 5, mahasiswa diharapkan dapat:
 Menggunakan operator JOIN
 Menggunakan variabel
 Menggunakan fungsi agregat untuk melakukan perhitungan
 Mengembalikan dan memanipulasi nilai tanggal dan waktu dengan menggunakan fungsi tanggal
dan waktu
 Mengkonversi data menggunakan fungsi CAST dan CONVERT
 Memanipulasi nilai string
 Menambah logika ke pernyataan T-SQL menggunakan fungsi built-in
 Menulis query PIVOT dan UNPIVOT
 Menulis query untuk melakukan paging
 Menangani kesalahan-kesalahan T-SQL di dalam query
 Menambah logika kontrol di antara dan di dalam pernyataan T-SQL

UNIT CONTENTS
 Menggunakan Operator JOIN Untuk Mengembalikan Data Dari Beberapa Tabel
 Menggunakan Variabel
 Menggunakan Fungsi Agregat
 Menggunakan Fungsi Tanggal dan Waktu
 Menggunakan Fungsi Konversi
 Menggunakan Fungsi String
 Menggunakan Fungsi Logika
 Melakukan Pivoting dan Unpivoting Pada Data
 Melakukan Paging Pada Data
 Menangani Kesalahan-Kesalahan T-SQL
 Keyword Untuk Pengontrolan Aliran (Control-of-Flow)

2018 ©2018 STMIK Mikroskil. All rights reserved. 239


Chatrine Sylvia, Catherine Database Data & Information Mngt

Pada modul ini akan dieksplorasi beberapa metoda yang dapat


INFORMASI
digunakan untuk membantu dalam menggabungkan data dari beberapa
tabel. Selain itu, juga akan dibahas mengenai penggunaan variabel.
Untuk mengeksplorasi
Microsoft SQL Server 2014 juga menyediakan beragam fungsi built-in dan semua fungsi built-in yang
fungsi user-defined, dimana tujuan dan hasilnya bervariasi tergantung pada tersedia, rujuk ke halaman
tipe dan penggunaan. Fungsi built-in dapat berupa deterministic atau MSDN “Built-in Functions
nondeterministic. Fungsi deterministic selalu mengembalikan nilai yang (Transact-SQL)”.
sama, sementara fungsi nondeterministic dapat mengembalikan nilai yang http://msdn.microsoft.com/
en-us/library/ms174318
berbeda tergantung pada nilai pada parameter input. Pada SQL Server 2014,
fungsi dikelompokkan dalam beberapa kategori, yaitu:
1. Fungsi agregat
2. Fungsi konfigurasi
3. Fungsi kursor
4. Fungsi tanggal dan waktu
5. Fungsi konversi
6. Fungsi matematis
7. Fungsi metadata
8. Fungsi rowset
9. Fungsi keamanan
10. Fungsi string
11. Fungsi logika
12. Fungsi statistik sistem
13. Fungsi lainnya
Namun yang akan dibahas hanya lima kategori, yaitu agregat, tanggal dan waktu, konversi,
string, dan logikal.

MENGGUNAKAN OPERATOR JOIN UNTUK MENGEMBALIKAN DATA DARI BEBERAPA


TABEL

Pada modul sebelumnya telah dipelajari bagaimana mengembalikan data dari sebuah tabel
tunggal. Dalam praktiknya, sangat jarang dijumpai query yang hanya mereferensi dari sebuah tabel,
biasanya diperlukan untuk mengembalikan data dari beberapa tabel. Untuk melakukannya digunakan
operator JOIN. Terdapat beberapa jenis operator JOIN, namun yang menjadi fokus pembahasan pada
modul ini hanya tiga, yaitu:
1. INNER
2. LEFT OUTER
3. RIGHT OUTER

MENGGUNAKAN INNER JOIN

Dari ketiga operator JOIN yang paling umum digunakan, INNER JOIN adalah salah satu yang
paling dasar yang biasanya digunakan. INNER JOIN merupakan pencocokan persamaan di antara dua
atau lebih tabel. Sebagai contoh, diasumsikan terdapat sebuah tabel yang berisi data produk dan
tabel lainnya yang berisi data penjualan, serta dibutuhkan pencarian terhadapt produk-produk yang
telah dijual. Pada dasarnya, akan dicari perpotongan dari dua tabel pada beberapa nilai seperti yang
diilustrasikan pada gambar berikut ini. Bagian yang diarsir melukiskan baris-baris yang akan
dikembalikan dari sebuah query yang menggabungkan tabel Sales dan Product.

2018 ©2018 STMIK Mikroskil. All rights reserved. 240


Chatrine Sylvia, Catherine Database Data & Information Mngt

Gambar 5.1 | Perpotongan INNER JOIN

SINTAKS JOIN

Terlepas dari apakah menulis penggabungan INNER atau OUTER tetap


INFORMASI
akan dimulai dengan pernyataan SELECT dasar. Query berikut ini akan
digunakan sebagai pernyataan awal.
Beberapa tabel dapat
USE AdventureWorks2012;
digabungkan dalam
SELECT sebuah pernyataan SELECT
p.FirstName, dengan menyertakan
p.LastName statement JOIN dan ON
FROM Person.Person p tambahan.

Tabel yang terdapat pada klausa FROM harus berisi kolom dengan
nilai-nilai yang terdapat pada tabel yang direncanakan untuk digabung. Pada
kasus ini, juga akan disertakan alamat email sebagai hasil pencarian. Untuk menyelesaikannya, perlu
direferensi tabel kedua dalam query seperti yang diilustrasikan pada query berikut ini.
USE AdventureWorks2012;
SELECT
p.FirstName,
p.LastName,
ea.EmailAddress
FROM Person.Person AS p
INNER JOIN Person.EmailAddress AS ea
ON p.BusinessEntityID = ea.BusinessEntityID

Keyword INNER JOIN telah disertakan untuk menentukan tabel kedua yang akan digunakan
dalam query. INNER JOIN atau setiap operator JOIN harus digabungkan dengan keyword ON. Pada
klausa ON ditentukan kolom atau kolom-kolom mana yang akan digunakan untuk menggabungkan
(JOIN) kedua tabel. Kunci supaya kedua tabel berhasil digabungkan adalah dengan menentukan data
yang berpotongan, biasanya adalah dengan menyelaraskan hubungan antara kunci utama dan kunci
asing. Jika ingin melakukan LEFT OUTER JOIN atau RIGHT OUTER JOIN pada query sebelumnya, maka
gantikan INNER dengan LEFT OUTER atau RIGHT OUTER.

MENULIS QUERY INNER JOIN

1. Aktifkan editor query di SSMS.


2. Ketikkan dan jalankan kode T-SQL berikut ini.

2018 ©2018 STMIK Mikroskil. All rights reserved. 241


Chatrine Sylvia, Catherine Database Data & Information Mngt

USE AdventureWorks2012;
SELECT
p.ProductID,
p.Name AS ProductName,
sd.OrderQty,
sd.UnitPrice
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail sd
ON p.ProductID = sd.ProductID

Gambar 5.2 Hasil Execute Query INNER JOIN

MENGGUNAKAN OUTER JOIN

Terdapat dua tipe dasar OUTER JOIN, yaitu LEFT dan RIGHT. Keduanya menyediakan
fungsionalitas yang sama, namun terdapat sedikit perbedaan, tergantng pada urutan tabel dalam
query. Dengan menggunakan contoh penjualan produk sebelumnya, jika query dibaca dari kiri ke
kanan, maka tabel yang dijumpai pertama kali adalah tabel Production.Product, yaitu sebagai tabel
kiri. Tabel kedua yang dijumpai adalah tabel Sales.SalesOrderDetail, yaitu sebagai tabel kanan. Oleh
karena itu, jika akan dikembalikan daftar produk tanpa memperhatikan apakah produk tersebut
terdapat di dalam tabel Sales.SalesOrderDetail atau tidak, maka pilihannya adalah LEFT OUTER JOIN.
Operator LEFT OUTER JOIN mengembalikan seluruh baris yang terdapat pada tabel sebelah kiri. Jika
data hanya tersedia pada tabel sebelah kiri namun tidak tersedia pada tabel sebelah kanan maka
nilai yang dimunculkan pada tabel sebelah kanan yaitu NULL. Gambar berikut mengilustrasikan LEFT
OUTER JOIN.

2018 ©2018 STMIK Mikroskil. All rights reserved. 242


Chatrine Sylvia, Catherine Database Data & Information Mngt

Gambar 5.3 | Perpotongan LEFT OUTER JOIN

Sebaliknya, jika akan dikembalikan semua penjualan, baik yang berkaitan atau tidak dengan
sebuah produk, maka pilihannya adalah RIGHT OUTER JOIN. Operator RIGHT OUTER JOIN
mengembalikan seluruh baris dari tabel sebelah kanan. Jika data hanya tersedia pada tabel sebelah
kanan namun tidak tersedia pada tabel sebelah kiri maka nilai yang dimunculkan pada tabel sebelah
kiri yaitu NULL. Gambar berikut mengilustrasikan RIGHT OUTER JOIN.

Gambar 5.4 | Perpotongan RIGHT OUTER JOIN

Selain LEFT OUTER JOIN dan RIGHT OUTER JOIN, juga terdapat operator FULL OUTER JOIN.
Operator FULL OUTER JOIN mengembalikan seluruh baris dari seluruh tabel yang digabungkan. Sama
halnya dengan opeator LEFT OUTER JOIN dan RIGHT OUTER JOIN, apabila data tidak tersedia di salah
satu tabel maka nilai yang dimunculkan yaitu NULL.

Gambar 5.5 | Perpotongan FULL OUTER JOIN

Tergantung pada tipe OUTER JOIN, sintaksnya mirip dengan INNER JOIN. Keyword INNER
digantikan dengan LEFT OUTER atau RIGHT OUTER maupun FULL OUTER.

2018 ©2018 STMIK Mikroskil. All rights reserved. 243


Chatrine Sylvia, Catherine Database Data & Information Mngt

MENULIS QUERY LEFT OUTER JOIN

1. Aktifkan editor query di SSMS.


2. Ketikkan dan jalankan kode T-SQL berikut ini.
USE AdventureWorks2012;
SELECT
p.ProductID,
sd.ProductID,
p.Name AS ProductName,
sd.OrderQty,
sd.UnitPrice
FROM Production.Product p
LEFT OUTER JOIN Sales.SalesOrderDetail sd
ON p.ProductID = sd.ProductID

Gambar 5.6 | Hasil Execute Query LEFT OUTER JOIN

Jika hasil query di-scroll ke bawah, maka akan terlihat nilai-nilai NULL pada kolom-kolom yang
merupakan bagian dari tabel Sales.SalesOrderDetail. Hal tersebut merupakan hasil langsung dari
penggunaan OUTER JOIN. Perhatikan kembali bagian yang diarsir pada gambar yang mengilustrasikan
hasil yang dikembalikan dari LEFT OUTER JOIN. Baris-baris tersebut yang diharapkan dari
pengembalian query, dimana bukan hanya produk yang berkaitan dengan penjualan yang
dikembalikan, namun juga yang tanpa penjualan.

2018 ©2018 STMIK Mikroskil. All rights reserved. 244


Chatrine Sylvia, Catherine Database Data & Information Mngt

MENULIS QUERY RIGHT OUTER JOIN

1. Aktifkan editor query di SSMS.


2. Ketikkan dan jalankan kode T-SQL berikut ini.
USE AdventureWorks2012;
SELECT soh.SalesOrderID,
soh.SalesOrderNumber,
soh.CustomerID,
c.CustomerID,
soh.OrderDate,
c.ModifiedDate
FROM Sales.SalesOrderHeader AS soh
RIGHT OUTER JOIN Sales.Customer as c
on soh.CustomerID = c.CustomerID

Gambar 5.7 | Hasil Execute Query RIGHT OUTER JOIN

MENULIS QUERY FULL OUTER JOIN

1. Aktifkan editor query di SSMS.


2. Ketikkan dan jalankan kode T-SQL berikut ini.
USE AdventureWorks2012;
SELECT
pv.ProductID,
sod.ProductID,
pv.StandardPrice,
sod.OrderQty,
sod.UnitPrice

2018 ©2018 STMIK Mikroskil. All rights reserved. 245


Chatrine Sylvia, Catherine Database Data & Information Mngt

FROM Purchasing.ProductVendor pv
FULL OUTER JOIN Sales.SalesOrderDetail sod
ON pv.ProductID = sod.ProductID

Gambar 5.8 | Hasil Execute Query FULL OUTER JOIN

MEMODIFIKASI BARIS-BARIS DENGAN MEREFERENSI BANYAK T ABEL

Biasanya akan dijumpai situasi dimana dibutuhkan untuk mereferensi ke tabel tambahan
ketika memperbarui sebuah baris. Tabel-tabel tambahan dapat digunakan untuk membatasi baris-
baris yang akan diperbarui, atau tabel-tabel tersebut akan menyediakan sebuah nilai yang dapat
digunakan dalam ekspresi sebagai bagian dari proses pembaruan. Dengan menggunakan klausa JOIN
dapat dirujuk ke tabel tambahan, sama seperti halnya pada pernyataan SELECT.

MEMPERBARUI BARIS-BARIS DENGAN MENGGUNAKAN QUERY JOIN DAN UPDATE

1. Aktifkan editor query di SSMS.


2. Sebelum menjalankan query untuk memperbarui baris, maka ketikkan dan jalankan terlebih
dahulu query berikut ini.
USE AdventureWorks2012;
SELECT
ps.Name,
p.ListPrice

2018 ©2018 STMIK Mikroskil. All rights reserved. 246


Chatrine Sylvia, Catherine Database Data & Information Mngt

FROM Production.Product p
INNER JOIN Production.ProductSubcategory ps
ON p.ProductSubcategoryID = ps.ProductSubcategoryID
WHERE ps.Name = 'Socks'

Query di atas akan menghasilkan kolom Name dan ListPrice yang merupakan gabungan dari tabel
Production.Product dan Production.ProductSubcategory dimana data yang ditampilkan hanya
produk dengan nama berupa “Socks” beserta ListPrice-nya.

Gambar 5.9 | Hasil Execute Query Sebelum Dijalankan Query UPDATE

3. Ketikkan dan jalankan kode T-SQL berikut ini.


USE AdventureWorks2012;
UPDATE Production.Product
SET ListPrice = p.ListPrice * 1.05
FROM Production.Product p
INNER JOIN Production.ProductSubcategory ps
ON p.ProductSubcategoryID = ps.ProductSubcategoryID
WHERE ps.Name = 'Socks'

Query di atas menggunakan tabel Production.ProductSubcategory untuk membatasi jumlah baris


yang akan diperbarui, dimana dibatasi hanya pada yang terdapat di dalam subkategori “Socks”.
Kolom ListPrice untuk setiap baris yang terdapat di dalam kelompok tersebut akan dinaikkan
sebesar 1,05.
4. Jalankan kode T-SQL pada langkah kedua.

Gambar 5.10 | Hasil Execute Query Setelah Dijalankan Query UPDATE

MENGHAPUS BARIS-BARIS DENGAN MENGGUNAKAN QUERY JOIN DAN DELETE

1. Aktifkan editor query di SSMS.


2. Sebelum menjalankan query untuk memperbarui baris, maka ketikkan dan jalankan terlebih
dahulu query berikut ini.
USE AdventureWorks2012;
SELECT
d.DepartmentID,
ed.DepartmentID

2018 ©2018 STMIK Mikroskil. All rights reserved. 247


Chatrine Sylvia, Catherine Database Data & Information Mngt

FROM HumanResources.Department d
LEFT OUTER JOIN HumanResources.EmployeeDepartmentHistory ed
ON d.DepartmentID = ed.DepartmentID
WHERE ed.DepartmentID IS NULL

Query di atas akan menghasilkan dua kolom DepartmentID dari tabel berbeda yaitu tabel
HumanResources.Department dan tabel HumanResources.EmployeeDepartmentHistory. Pada
kolom DepartmentID dari tabel HumanResources.EmployeeDepartmentHistory, menunjukkan
hasil berupa nilai NULL yang artinya data tersedia pada tabel HumanResources.Department
namun tidak tersedia pada tabel HumanResources.EmployeeDepartmentHistory.

Gambar 5.11 | Hasil Execute Query Sebelum DELETE

3. Ketikkan dan jalankan kode T-SQL berikut ini.


USE AdventureWorks2012;
DELETE FROM HumanResources.Department
FROM HumanResources.Department d
LEFT OUTER JOIN HumanResources.EmployeeDepartmentHistory ed
ON d.DepartmentID = ed.DepartmentID
WHERE ed.DepartmentID IS NULL

Pada query di atas, tabel HumanResources.EmployeeDepartmentHistory digunakan untuk


mengidentifikasi departemen-departemen di dalam tabel HumanResources.Department yang
tidak berasosiasi dengan baris-baris manapun di dalam tabel yang direferensi. Menggabungkan
referensi LEFT OUTER JOIN dengan klausa WHERE memastikan hanya baris-baris tersebut yang
akan dihapus.
Jalankan kode T-SQL pada langkah kedua. Dapat dilihat bahwa data telah dihapus dari tabel
HumanResources.Department sehingga tidak ada yang dihasilkan ketika kode T-SQL pada langkah
kedua dijalankan kembali.

MENGGUNAKAN VARIABEL

Seperti halnya bahasa pemrograman, kode transact-SQL pada SQL Server juga memungkinkan
tempat penyimpanan sementara dalam bentuk variabel. Variabel disimpan dalam memori dan dapat
diakses hanya melalui suatu batch atau stored procedure, atau melalui suatu function dimana
variabel dideklarasi. Terdapat tiga tipe variabel yang dapat dibuat di dalam SQL Server yaitu local
variables (berdasarkan sistem atau tipe data user-defined), cursor variables (untuk menyimpan
server-side cursor), dan table variables (terstruktur layaknya user-defined table). Pada pembahasan
ini, hanya akan dibahas mengenai local variables.
Pada saat pencarian/pengembalian data, akan dijumpai situasi dimana terdapat kebutuhan
untuk menyimpan sebuah nilai secara sementara untuk penggunaan selanjutnya di dalam query.
Mungkin sebuah nilai dari pernyataan SELECT atau nilai konstan yang akan digunakan selanjutnya di

2018 ©2018 STMIK Mikroskil. All rights reserved. 248


Chatrine Sylvia, Catherine Database Data & Information Mngt

dalam query. Untuk menggunakan sebuah variabel, harus dideklarasikan terlebih dahulu. Berikutnya,
tambahkan simbol @ sebagai awalan pada nama variabel. Setelah itu, tentukan tipe data yang akan
disimpan pada variabel. Sintaks untuk mendeklarasikan variabel adalah sebagai berikut.
DECLARE @variable int
Setelah variabel dideklarasikan, maka nilai-nilai dapat diberikan ke variabel tersebut.
Terdapat tiga cara untuk melakukannya, yaitu menggunakan kata kunci SET (cara yang paling dipilih),
menggunakan pernyataan SELECT untuk memberikan sebuah nilai, atau memberikan sebuah nilai
pada saat mendeklarasikan variabel. Sintaks untuk memberikan nilai pada sebuah variabel
menggunakan cara-cara tersebut adalah sebagai berikut.
--Use this syntax to assign a value using the SET keyword
DECLARE @variable int
SET @variable = <value>

--Use this syntax to assign a value using a SELECT statement


SELECT @variable = <column or expression>
FROM <table name>

--Use this syntax to assign a value to a variable when it is declared


DECLARE @variable int = <value>

MENULIS QUERY YANG MENGGUNAKAN VARIABEL

1. Aktifkan editor query di SSMS.


2. Ketikkan kode T-SQL berikut ini, jalankan dan lihat hasilnya.
USE AdventureWorks2012;
DECLARE @PRODUCTID INT = 1;

SELECT
ProductID,
ProductNumber,
Name AS ProductName
FROM Production.Product
WHERE ProductID = @ProductID

Kode T-SQL di atas harus dijalankan sekaligus. DECLARE berfungsi untuk mendeklarasikan dan
memberikan sebuah nilai pada variabel ProductID dimana nilai awal dari variabel ProductID
adalah 1. Pada query SELECT memilih informasi produk dengan sebuah persamaan di klausa
WHERE menggunakan variabel sebagai nilai penyaring yang artinya, pernyataan SELECT akan
menampilkan data ProductID, ProductNumber dan Name dimana nilai dari ProductID sesuai
dengan nilai pada variabel ProductID.

Gambar 5.12 | Hasil Execute Query Pernyataan DECLARE

2018 ©2018 STMIK Mikroskil. All rights reserved. 249


Chatrine Sylvia, Catherine Database Data & Information Mngt

MENGGUNAKAN FUNGSI AGREGAT

Fungsi agregat melakukan perhitungan pada sekumpulan nilai, dan mengembalikan nilai
tunggal. Kecuali pada fungsi COUNT, fungsi agregat mengabaikan nilai NULL. Fungsi agregat sering
digunakan dengan klausa GROUP BY pada pernyataan SELECT. Semua fungsi agregat bersifat
deterministik. Dengan kata lain, fungsi agregat mengembalikan nilai yang sama setiap kali mereka
dipanggil, ketika dipanggil dengan serangkaian nilai input tertentu.
Fungsi agregat beroperasi pada sekelompok baris dan mengembalikan nilai ringkasan tunggal.
Pada SQL Server 2014, fungsi agregat termasuk AVG, MIN, MAX, SUM, CHECKSUM_AGG, COUNT,
COUNT_BIG, STDEV, STDEVP, GROUPING, GROUPING_ID, VAR, dan VARP.

MENGGUNAKAN FUNGSI AVG

1. Aktifkan editor query di SSMS.


2. Sebelum menjalankan fungsi AVG, ketikkan kode T-SQL berikut ini, jalankan dan lihat hasilnya.
USE AdventureWorks2012;
SELECT
BusinessEntityID,
Rate
FROM HumanResources.EmployeePayHistory
WHERE BusinessEntityID = 174;

Gambar 5.13 | Hasil Execute Query

Dari hasil gambar di atas, ditunjukkan 3 baris data dimana data yang dimunculkan berupa jumlah
pembayaran gaji yang diterima BusineesEntityID = 174.
3. Setelah melihat hasil query diatas kemudian ketikkan dan jalankan kode T-SQL berikut ini.
USE AdventureWorks2012;
SELECT AVG(Rate) AS AverageRate
FROM HumanResources.EmployeePayHistory
WHERE BusinessEntityID = 174;

4. Hasilnya berupa nilai rata-rata pembayaran gaji saat query tersebut dijalankan.

Gambar 5.14 | Hasil Execute Query Fungsi AVG

MENGGUNAKAN FUNGSI COUNT

1. Aktifkan editor query di SSMS.


2. Sebelum menjalankan fungsi COUNT, ketikkan kode T-SQL berikut ini, jalankan dan lihat hasilnya.

2018 ©2018 STMIK Mikroskil. All rights reserved. 250


Chatrine Sylvia, Catherine Database Data & Information Mngt

USE AdventureWorks2012;
SELECT *
FROM Sales.SalesOrderDetail
WHERE ProductID = 777;

Gambar 5.15 | Hasil Execute Query

Pada query di atas, dihasilkan data sebanyak 242 baris dimana data yang dimunculkan hanya yang
ProductID = 777.
3. Setelah melihat hasil query diatas kemudian ketikkan dan jalankan kode T-SQL berikut ini.
USE AdventureWorks2012;
SELECT COUNT(*) AS Jumlah_Baris
FROM Sales.SalesOrderDetail
WHERE ProductID = 777;
Query diatas dipakai untuk menghitung jumlah data yang terdapat pada suatu tabel.

4. Hasilnya berupa jumlah data hasil perhitungan saat query tersebut dijalankan.

Gambar 5.16 | Hasil Execute Query Fungsi COUNT

MENGGUNAKAN FUNGSI T ANGGAL DAN WAKTU

SQL Server memungkinkan nilai tanggal dan waktu untuk disimpan dalam berbagai format.
Karena dimungkinkan untuk menyimpan nilai tanggal dan waktu pada beberapa kemungkinan format,
adalah optimal untuk menggunakan fungsi-fungsi SQL Server untuk mengembalikan nilai tanggal dan
waktu dalam format yang sesuai dengan kebutuhan. Dengan menggunakan fungsi-fungsi tersebut
dapat dilakukan beberapa hal sebagai berikut:
1. Mengembalikan nilai tanggal dan waktu dengan presisi yang bervariasi
2. Mengembalikan bagian dari nilai tanggal dan waktu
3. Memperoleh nilai tanggal dan waktu dari bagian tanggal dan waktu
4. Mengambil selisih tanggal dan waktu
5. Memodifikasi nilai tanggal dan waktu
6. Memvalidasi nilai tanggal dan waktu

2018 ©2018 STMIK Mikroskil. All rights reserved. 251


Chatrine Sylvia, Catherine Database Data & Information Mngt

MENGEMBALIKAN NILAI TANGGAL DAN WAKTU

1. Aktifkan editor query di SSMS.


2. Ketikkan kode T-SQL berikut ini, jalankan dan lihat hasilnya.
SELECT GETDATE() AS GETDATE,
SYSDATETIME() AS SYSDATETIME;

3. Hasilnya berupa nilai tanggal dan waktu tunggal saat query tersebut dijalankan.

Gambar 5.17 | Hasil Execute Query Mengembalikan Nilai Tanggal dan Waktu

Perhatikan bahwa presisi nilai dari kedua fungsi tersebut berbeda. Fungsi GETDATE() mengembalikan
tipe data DATETIME, sedangkan fungsi SYSDATETIME mengembalikan tipe data datetime2(7).

MENGEMBALIKAN BAGIAN DARI NILAI TANGGAL DAN WAKTU

1. Aktifkan editor query di SSMS.


2. Ketikkan kode T-SQL berikut ini, jalankan dan lihat hasilnya.
SELECT
DAY(GETDATE()) AS DAY,
MONTH(GETDATE()) AS MONTH,
YEAR(GETDATE()) AS YEAR,
DATENAME(WEEKDAY, GETDATE()) AS DATENAMEWeekDay,
DATEPART(M, GETDATE()) AS DATEPART,
DATEPART(WEEKDAY, GETDATE()) AS DatePartWeekDay,
DATENAME(MONTH, GETDATE()) AS DateNameMonth

Gambar 5.18 | Hasil Execute Query Mengembalikan Bagian Dari Nilai Tanggal dan Waktu

Nilai yang dikembalikan dari ketiga fungsi pertama (DAY, MONTH, dan YEAR) adalah tanggal, bulan,
dan tahun saat query tersebut dijalankan. Dua fungsi berikutnya (DATENAME dan DATEPART)
menawarkan fungsionalitas yang lebih serta membutuhkan parameter tambahan yang disebut sebagai
datepart. Parameter datepart memberitahukan fungsi tersebut bagian mana dari tanggal yang akan
dikembalikan. Tabel berikut ini berisi semua datepart yang tersedia yang dapat digunakan sebagai
parameter.
Tabel 5.1 | Daftar Argumen datepart Yang Valid

Datepart Abbreviations
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y

2018 ©2018 STMIK Mikroskil. All rights reserved. 252


Chatrine Sylvia, Catherine Database Data & Information Mngt

week wk, ww
weekday dw
hour hh
minute mi, n
second ss, s
millisecond ms
microsecond mcs
nanosecond ns
TZoffset tz
ISO_WEEK isowk, isoww

Setiap argumen datepart mengembalikan nilai bilangan bulat. Akan tetapi, perhatikan bahwa
nilai string akan dikembalikan ketika menggunakan month dan weekday sebagai argumen datepart
untuk fungsi DATENAME. Hal tersebut merupakan perbedaan utama di antara fungsi DATEPART dan
DATENAME. Fungsi DATEPART mengembalikan tipe data berupa nilai bilangan bulat, sedangkan fungsi
DATENAME dapat mengembalikan nilai string (tipe data nvarchar).

MEMPEROLEH TANGGAL D ARI BAGIAN TANGGAL MENGGUNAKAN FUNGSI S KALAR


DATEFROMPARTS

1. Aktifkan editor query di SSMS.


2. Ketikkan kode T-SQL berikut ini, jalankan dan lihat hasilnya.
SELECT
DATEFROMPARTS (1998, 7, 20) AS DATEFROMPARTS,
DATETIME2FROMPARTS (1998, 7, 20, 10, 12, 24, 15, 3) AS DATETIME2FROMPARTS,
DATETIMEFROMPARTS (1998, 7, 20, 10, 12, 24, 15) AS DATETIMEFROMPARTS,
DATETIMEOFFSETFROMPARTS (1998, 7, 20, 10, 12, 24, 15, 12, 0, 3) AS
DATETIMEOFFSETFROMPARTS,
SMALLDATETIMEFROMPARTS (1998, 7, 20, 10, 12) SMALLDATETIMEFROMPARTS,
TIMEFROMPARTS(10, 12, 24, 15, 3) TIMEFROMPARTS

Gambar 5.19 | Hasil Execute Query Menggunakan Fungsi Skalar DATEFROMPARTS

Nilai tanggal dan waktu yang bervariasi dengan tingkat presisi yang berbeda dapat dibuat
dengan menggunakan fungsi-fungsi built-in daripada menulis kode T-SQL yang dibuat sendiri.

MENCARI SELISIH, MEM ODIFIKASI, DAN MEMVALIDASI NILAI TANGGAL

Sebagai tambhan terhadap fungsi-fungsi yang ditawarkan sebelumnya, T-SQL memungkinkan


untuk melakukan perhitungan terhadap nilai tanggal dan memvalidasi nilai tanggal. Sebagai contoh,
dapat dihitung jumlah hari di antara dua tanggal, atau dapat menambah nilai bulan atau tahun pada
sebuah tanggal. Fungsi EOMONTH digunakan untuk menentukan tanggal terakhir dari bulan yang
diberikan.

MELAKUKAN PERHITUNGAN DAN VALIDASI TANGGAL

1. Aktifkan editor query di SSMS.

2018 ©2018 STMIK Mikroskil. All rights reserved. 253


Chatrine Sylvia, Catherine Database Data & Information Mngt

2. Ketikkan kode T-SQL berikut ini, jalankan dan lihat hasilnya.


SELECT
DATEDIFF(dd, GETDATE(), '12/31/2019') AS DaysUntilMyBirthday,
DATEADD(y, 1, GETDATE()) AS DateAdd,
EOMONTH(GETDATE()) AS EOMonth,
ISDATE(GETDATE()) AS IsValidDate,
ISDATE('13/1/2122') AS InvalidDate

Gambar 5.20 | Hasil Execute Query Melakukan Perhitungan dan Validasi Tanggal

Dengan menggunakan fungsi DATEDIFF dapat dicari selisih hari,


bulan, atau tahun di antara dua nilai tanggal. Argumen datepart, yaitu dd, INFORMASI
menentukan bagian mana dari tanggal yang akan dikembalikan. Fungsi
DATEADD juga menggunakan argumen datepart, akan tetapi, dapat digunakan Terlepas dari jenis fungsi
untuk menambah atau mengurangi dari nilai tanggal. Fungsi EOMONTH yang digunakan, nilai
digunakan untuk mengembalikan hari terakhir dari bulan untuk nilai tanggal yang dikembalikan fungsi
yang diberikan. Selanjutnya, fungsi ISDATE digunakan untuk menentukan dapat digunakan di
dalam persamaan
apakah tanggal yang diberikan valid atau tidak. Nilai 1 akan dikembalikan jika
variabel ataupun sebagai
tanggal valid, sebaliknya nilai 0 akan dikembalikan jika tanggal tidak valid. nilai di dalam pernyataan
SELECT.
MENGGUNAKAN FUNGSI KONVERSI

Fungsi konversi dibagi menjadi dua kategori, yaitu CAST dan CONVERT. Tujuan utama dari
kedua tipe tersebut adalah untuk mengubah sebuah nilai dari sebuah tipe data ke tipe data lainnya.
Perbedaan CONVERT dengan CAST adalah CONVERT menyediakan kemampuan untuk melakukan
format terhadap keluaran dari hasil konversi. Selain fungsi CAST dan CONVERT terdapat empat fungsi
lain yang dapat dipakai untuk melakukan konversi, yaitu:
1. PARSE
2. TRY_PARSE
3. TRY_CAST
4. TRY_CONVERT

MENGKONVERSI DATA ME NGGUNAKAN FUNGSI CAST

1. Aktifkan editor query di SSMS.


2. Ketikkan dan jalankan kode T-SQL berikut ini.
USE AdventureWorks2012;
SELECT TOP(10)
SalesOrderNumber,
TotalDue,
CAST(TotalDue AS decimal(10,2)) AS TotalDueCast,
OrderDate,
CAST(OrderDate AS DATE) AS OrderDateCast
FROM Sales.SalesOrderHeader;

2018 ©2018 STMIK Mikroskil. All rights reserved. 254


Chatrine Sylvia, Catherine Database Data & Information Mngt

Gambar 5.21 | Hasil Execute Query Menggunakan Fungsi CAST

Pada query di atas, nilai yang disimpan untuk kolom TotalDue


memungkinkan penyimpanan dengan presisi empat angka di belakang INFORMASI
desimal. Dengan menggunakan fungsi CAST dapat diubah jumlah angka di
belakang desimal yang akan dikembalikan. Selain itu, dapat juga digunakan Daftar detail kode-kode yang
fungsi CAST untuk mengembalikan hanya nilai tanggal dari kolom OrderDate digunakan untuk setiap tipe
daripada menampilkan nilai tanggal dan waktu. style dapat dilihat di bagian
CAST dan CONVERT pada SQL
Walaupun fungsi CONVERT dan CAST melakukan fungsi utama yang
Server Books Online dan di
sama, namun fungsi CONVERT menawarkan beberapa fleksibilitas tambahan halaman
dibandingkan fungsi CAST, dimana dapat dilakukan format terhadap http://msdn.microsoft.com/en
keluaran dari hasil query dengan menggunakan argumen style. Style dapat -us/library/ms187928
diterapkan pada tipe data date, time, real, float, money, xml, dan binary.

MENGKONVERSI DATA ME NGGUNAKAN FUNGSI CONVERT

1. Aktifkan editor query di SSMS.


2. Ketikkan dan jalankan kode T-SQL berikut ini.
SELECT
CONVERT(VARCHAR(20), GETDATE()) AS [Default],
CONVERT(VARCHAR(20), GETDATE(), 100) AS DefaultWithStyle,
CONVERT(VARCHAR(10), GETDATE(), 103) AS BritishFrenchStyle,
CONVERT(VARCHAR(8), GETDATE(), 105) AS ItalianStyle,
CONVERT(VARCHAR(8), GETDATE(), 112) AS ISOStyle,
CONVERT(VARCHAR(15), CAST('111111.22' AS MONEY), 1) AS MoneyWithCommas

Gambar 5.22 | Hasil Execute Query Menggunakan Fungsi CONVERT

Fungsi CONVERT memiliki tiga argumen. Argumen pertama merupakan tipe data tujuan atau
tipe data yang diinginkan untuk mengkonversi nilai yang diberikan. Argumen kedua merupakan nilai
aktual yang akan dikonversi. Argumen terakhir merupakan style, dimana bersifat opsional, dan jika
tidak disertakan, maka SQL Server akan menggunakan nilai default.
Pada contoh sebelumnya, lima kolom pertama menunjukkan konversi tanggal ke style negara
yang berbeda. Kolom terakhir menunjukkan penggunaan fungsi CONVERT untuk menambah simbol
koma (,) ke nilai dengan tipe data money. Pada query tersebut, fungsi CAST pada baris terakhir

2018 ©2018 STMIK Mikroskil. All rights reserved. 255


Chatrine Sylvia, Catherine Database Data & Information Mngt

digunakan untuk melakukan konversi dari tipe data string ke money, dan fungsi CONVERT digunakan
untuk melakukan konversi terhadap nilai tersebut kembali ke tipe data string disertai simbol koma.

MENGKONVERSI TANGGAL MENGGUNAKAN FUNGSI LAINNYA

1. Aktifkan editor query di SSMS.


2. Ketikkan dan jalankan kode T-SQL berikut ini.
SELECT
TRY_CAST('CHRISTOPHER' AS INT) TryCast,
TRY_CONVERT(DATETIME, '13/32/2999', 112) AS TryConvert,
PARSE('Thursday, 18 July 2019' AS DATETIME USING 'en-US') AS [Parse],
TRY_PARSE('Christopher BirthDay' AS DATETIME USING 'en-US') AS TryParse

Gambar 5.23 | Hasil Execute Query Menggunakan Fungsi Konversi Lainnya

Daripada menggagalkan eksekusi query, fungsi TRY menyediakan pendekatan yang lebih
elegan dengan mengembalikan nilai NULL. TRY_CONVERT dan TRY_CAST merupakan perluasan dari
fungsi CONVERT dan CAST yang telah ada. Fungsi PARSE digunakan ketika melakukan konversi dari
tipe data string ke tanggal/waktu dan bilangan. Fungsi lainnya, yang diawali dengan TRY_, menambah
fungsionalitas pada fungsi CONVERT, CAST, dan PARSE dasar. Melakukan konversi terhadap sebuah
nilai dengan menggunakan salah satu dari fungsi-fungsi sebelumnya akan mengakibatkan kegagalan
terhadap keseluruhan pernyataan. Akan tetapi, jika menggunakan salah satu fungsi dengan versi TRY,
maka nilai NULL akan dikembalikan.

MENGGUNAKAN FUNGSI STRING

SQL Server menyertakan 31 fungsi string skalar built-in. Setiap fungsi melakukan beberapa
operasi pada nilai string atau numerik yang disediakan. Sebagai catatan, jika mencoba untuk
mengkombinasikan atau menggabungkan nilai string atau numerik, maka nilai numerik harus
dikonversi ke nilai string terlebih dahulu. Untuk mempelajari keseluruhan fungsi string, kunjungi
halaman “String Functions (Transact-SQL) di MSDN di http://msdn.microsoft.com/en-
us/library/ms181984.

MENGGUNAKAN FUNGSI S TRING SQL SERVER

1. Aktifkan editor query di SSMS.


2. Ketikkan dan jalankan kode T-SQL berikut ini.
SELECT
'ROBERT '+', '+' CHRISTOPHER' AS RawValues,
RTRIM('ROBERT ')+', '+LTRIM(' CHRISTOPHER') AS TrimValue,
LEFT('ChristopherRobertJoseph', 11) AS [Left],
RIGHT('ChristopherRobertJoseph', 6) AS [Right],
SUBSTRING('ChristopherRobertJoseph',12,6) AS [Substring],
LEN('ChristopherRobertJoseph') AS CharacterLength,
'12/'+CAST(1 AS varchar)+'/2019' AS WithoutConcat,
CONCAT('12/',1,'/2019') AS WithConcat

2018 ©2018 STMIK Mikroskil. All rights reserved. 256


Chatrine Sylvia, Catherine Database Data & Information Mngt

Gambar 5.24 | Hasil Execute Query Menggunakan Fungsi String

Pada query di atas, dua kolom pertama dari hasil query menggabungkan dua nilai string. Perbedaan
di antara keduanya adalah kolom yang pertama berisi spasi sebelum dan setelah koma, sedangkan
kolom kedua tidak. Dengan menggunakan fungsi RTRIM dan LTRIM dapat dihapus spasi di sebelah
kanan string (RTRIM) dan di sebelah kiri string (LTRIM). Dua kolom berikutnya menggunakan fungsi
LEFT dan RIGHT, dimana mengembalikan nilai paling kiri atau paling kanan dari nilai string yang
disediakan berdasarkan argumen kedua. Pada query sebelumnya, fungsi LEFT mengembalikan tujuh
karakter pertama yang dimulai dari sebelah kiri, dan fungsi RIGHT juga melakukan hal yang sama,
namun dimulai dari sebelah kanan.
Fungsi SUBSTRING mengembalikan bagian dari sebuah string berdasarkan posisi awal dan akhir yang
ditentukan, yaitu dari kedua argumen terakhir yang disediakan pada fungsi. Pada query di atas, fungsi
SUBSTRING digunakan untuk mengembalikan sebuah nilai yang dimulai dari karakter ke-12 dan
mengambil sebanyak 6 karakter. Fungsi LEN akan mengembalikan panjang dari sebuah string. Pada
dua kolom terakhir, nilai tanggal diperoleh dari tiga nilai berbeda. Pada kolom WithoutConcat, fungsi
CAST digunakan untuk mengkonversi nilai bilangan bulat ke string untuk memastikan penggabungan
berhasil. Akan tetapi, jika menggunakan fungsi baru CONCAT, maka kebutuhan untuk menggunakan
CAST dikurangi karena secara otomatis mengkonversi nilai non string menjadi string.

MENGGUNAKAN FUNGSI LOGIKA

Fungsi logika yang akan dibahas di modul ini yaitu fungsi CHOOSE dan IIF. Dua fungsi logika
ini memungkinkan penyeleksian data inline dengan sedikit pemrograman. Fungsi CHOOSE
mengembalikan sebuah nilai dari daftar berdasarkan indeks tertentu. Fungsi IIF mengembalikan
sebuah nilai berdasarkan hasil evaluasi dari ekspresi Boolean menjadi true atau false.

MENGGUNAKAN FUNGSI C HOOSE DAN IIF

1. Aktifkan editor query di SSMS.


2. Ketikkan dan jalankan kode T-SQL berikut ini.
DECLARE @choosevar int = 3
SELECT
CHOOSE(@choosevar, 'ONE', 'TWO', 'CHRISTOPHER', 'THREE') AS [Choose],
IIF(DATENAME(MONTH, GETDATE()) = 'January', 'Happy New Year Everyone',
'Keep Calm And Wait For Holiday') AS [IIF]

Gambar 5.25 | Hasil Execute Query Menggunakan Fungsi Logika

Pada contoh sebelumnya, dapat dipilih item ketiga dari daftar string dengan menggunakan fungsi
CHOOSE. Jika nilai variabel 3 diganti menjadi 1, maka fungsi akan mengembalikan nilai pertama,
yaitu ONE, dari daftar string. Baris terakhir dari contoh sebelumnya menggunakan fungsi IIF untuk
menentukan mana dari kedua string yang akan dikembalikan. Argumen pertama yang digunakan pada
fungsi IIF mengevaluasi ke nilai true atau false. Pada contoh tersebut, sebuah ekspresi digunakan

2018 ©2018 STMIK Mikroskil. All rights reserved. 257


Chatrine Sylvia, Catherine Database Data & Information Mngt

untuk menentukan apakah bulan saat ini adalah July. Jika hasil evaluasi adalah true, maka nilai string
pertama yang akan dikembalikan, sebaliknya, nilai string kedua yang akan dikembalikan.

MELAKUKAN PIVOTING D AN UNPIVOTING PADA D ATA

Pada pembahasan ini akan dipelajari bagaimana mengunakan operator PIVOT dan UNPIVOT
untuk mengubah struktur dari hasil query secara fisik. Operator PIVOT dapat digunakan untuk
menukar nilai kolom spesifik menjadi beberapa kolom. Operator UNPIVOT melakukan operasi yang
berlawanan dengan mengubah kolom menjadi baris. Selain itu, akan diperkenalkan teknik paging dan
yang terakhir akan dibahas contoh bagaimana menangani kesalahan dan mengontrol aliran dari query
T-SQL. Konsep pivoting data pada SQL Server merujuk pada restrukturisasi data ke format lainnya.
Dua bentuk yang tersedia adalah PIVOT dan UNPIVOT.

MENGGUNAKAN OPERATOR PIVOT

Diasumsikan data di simpan dalam format seperti pada tabel berikut ini.
Tabel 5.2 | Data Baris Per Baris

Setiap baris dalam tabel merepresentasikan pesanan yang dilakukan oleh pelanggan dan
tenaga penjual yang menangani pesanan tesebut. Selain menampilkan informasi tersebut baris per
baris, dapat digunakan operator PIVOT untuk mengembalikan jumlah pesanan yang dilakukan oleh
setiap pelanggan serta dikelompokkan berdasarkan tenaga penjual. Tabel berikut ini
mengilustrasikan pivoting dari contoh data yang sedikit.
Tabel 5.3 | Pivoting Pada Data Sebelumnya

Kolom pertama dari tabel merepresentasikan tenaga penjual, dan setiap kolom berikutnya
merepresentasikan seorang pelanggan serta berapa banyak penjualan yang terjadi untuk pelanggan
tersebut. Baris pertama dari setiap kolom (kecuali kolom yang berisi SalesPersonID) berisi sebuah
CustomerID.
Berikut langkah-langkah menulis query Pivot, yaitu:
1. Aktifkan editor query di SSMS.
2. Ketikkan dan jalankan kode T-SQL berikut ini.
SELECT
SalesOrderID,
CustomerID,

2018 ©2018 STMIK Mikroskil. All rights reserved. 258


Chatrine Sylvia, Catherine Database Data & Information Mngt

SalesPersonID
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL
Query di atas merepresentasikan dasar dari pivot, dimana mengembalikan data baris per baris.

3. Tepat di atas query pada langkah 2, ketikkan kode T-SQL berikut ini.
USE AdventureWorks2012;
SELECT
SalesPersonID,
[29486] AS Cust1,
[29487] AS Cust2,
[29488] AS Cust3,
[29491] AS Cust4,
[29492] AS Cust5,
[29512] AS Cust6
FROM (
Bagian query di atas merepresentasikan bagaimana data akan dikembalikan.

4. Terakhir, tepat di bawah query pada langkah 2, ketikkan kode T-SQL berikut ini.
) AS p
PIVOT
(
COUNT(SalesOrderID)
FOR CustomerID IN
(
[29486],
[29487],
[29488],
[29491],
[29492],
[29512]
)
) AS pvt
ORDER BY SalesPersonID
Bagian query di atas menentukan operator PIVOT, apa yang akan diagregatkan, dan pelanggan
mana yang akan dimasukkan ke dalam hasil query.

5. Query lengkapnya adalah sebagai berikut.


USE AdventureWorks2012;
SELECT
SalesPersonID,
[29486] AS Cust1,
[29487] AS Cust2,
[29488] AS Cust3,
[29491] AS Cust4,
[29492] AS Cust5,
[29512] AS Cust6
FROM (
SELECT
SalesOrderID,
CustomerID,
SalesPersonID

2018 ©2018 STMIK Mikroskil. All rights reserved. 259


Chatrine Sylvia, Catherine Database Data & Information Mngt

FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL
) AS p
PIVOT
(
COUNT(SalesOrderID)
FOR CustomerID IN
(
[29486],
[29487],
[29488],
[29491],
[29492],
[29512]
)
) AS pvt
ORDER BY SalesPersonID

6. Jalankan query lengkap di atas. Setiap baris beragregat untuk menampilkan daftar dari tenaga
penjual dan berapa banyak penjualan yang telah dilakukan pada setiap pelanggan di dalam daftar
pivot.

Gambar 5.26 | Hasil Execute Query Operator PIVOT

MENGGUNAKAN OPERATOR UNPIVOT

Jika data yang tersedia tersusun seperti pada Gambar 5.19 dan diinginkan untuk menampilkan
setiap bris yang merepresentasikan penjualan terhadap setiap pelanggan seperti pada Tabel 5.2,
maka dapat digunakan operator UNPIVOT.
Berikut langkah-langkah menulis query Unpivot, yaitu:
1. Aktifkan editor query di SSMS.
2. Ketikkan dan jalankan kode T-SQL berikut ini.
USE AdventureWorks2012
GO
IF(OBJECT_ID('dbo.unPvt')) IS NOT NULL

2018 ©2018 STMIK Mikroskil. All rights reserved. 260


Chatrine Sylvia, Catherine Database Data & Information Mngt

DROP TABLE dbo.unPvt


GO
CREATE TABLE dbo.unPvt
(
SalesPersonID int,
Cust1 int,
Cust2 int,
Cust3 int,
Cust4 int,
Cust5 int,
Cust6 int
)
GO
INSERT INTO dbo.unPvt
(
SalesPersonID,
Cust1, Cust2,
Cust3, Cust4,
Cust5, Cust6
)
VALUES
(274, 5, 6, 4, 2, 6, 7),
(275, 1, 7, 2, 3, 6, 8),
(276, 0, 2, 8, 9, 6, 3),
(277, 6, 3, 1, 7, 6, 1),
(278, 5, 4, 9, 0, 2, 0),
(279, 2, 1, 0, 1, 8, 9)
GO
Query di atas menyediakan data yang dibutuhkan.

3. Ketikkan kode T-SQL berikut ini.


SELECT
SalesPersonID,
Cust1, Cust2,
Cust3, Cust4,
Cust5, Cust6
FROM dbo.unPvt
Query di atas merepresentasikan dasar dari UNPIVOT, dimana menyediakan data dasar yang
dibutuhkan.

4. Tepat di atas query pada langkah 3, ketikkan kode T-SQL berikut ini.
USE AdventureWorks2012;
GO
SELECT
SalesPersonID,
Customer,
Sales
FROM
(
Bagian query di atas merepresentasikan data yang akan dikembalikan ketika query lengkap
dijalankan.

2018 ©2018 STMIK Mikroskil. All rights reserved. 261


Chatrine Sylvia, Catherine Database Data & Information Mngt

5. Terakhir, tepat di bawah query pada langkah 3, ketikkan kode T-SQL berikut ini.
) AS up
UNPIVOT
(
Sales FOR Customer IN
(
Cust1, Cust2,
Cust3, Cust4,
Cust5, Cust6
)
) AS unpvt;
GO
Bagian query di atas menyertakan operator UNPIVOT dimana menampilkan daftar pelanggan
secara baris per baris (berbeda dengan operator PIVOT yang mengagregatkan data).

6. Query lengkapnya adalah sebagai berikut.


USE AdventureWorks2012
GO
SELECT
SalesPersonID,
Customer,
Sales
FROM
(
SELECT
SalesPersonID,
Cust1, Cust2,
Cust3, Cust4,
Cust5, Cust6
FROM dbo.unPvt
) AS up
UNPIVOT
(
Sales FOR Customer IN
(
Cust1, Cust2,
Cust3, Cust4,
Cust5, Cust6
)
) AS unpvt;
GO

7. Jalankan query di atas. Setiap baris merepresentasikan jumlah penjualan yang dilakukan pada
masing-masing pelanggan.

2018 ©2018 STMIK Mikroskil. All rights reserved. 262


Chatrine Sylvia, Catherine Database Data & Information Mngt

Gambar 5.27 | Hasil Execute Query Operator UNPIVOT

MELAKUKAN PAGING PAD A DATA

Permintaan umum terhadap fungsionalitas aplikasi biasanya berupa paging pada data.
Daripada mengembalikan keseluruhan baris, biasanya lebih disukai untuk menampilkan daftar pendek
yang dibagi-bagi per halaman serta sejumlah baris tertentu. Sebelum SQL Server 2012, developer
ataupun DBA dapat menggunakan beberapa teknik untuk mensimulasikan paging, namun pada SQL
Server 2012 telah tersedia paging pada sisi basis data.
SQL Server memperkenalkan sebuah penggabungan keyword yang menyediakan solusi paging
yang elegan dan efisien. Dengan menggunakan keyword OFFSET dan FETCH dapat ditulis query tunggal
yang mengembalikan data per satu halaman pada satu waktu ke aplikasi client atau end user.
 OFFSET: menentukan seberapa banyak baris yang akan dilewatkan sebelum query mulai
mengembalikan baris.
 FETCH: menentukan seberapa banyak baris yang akan dikembalikan setelah OFFSET diproses.
OFFSET bersinonim dengan jumlah halaman, sedangkan FETCH bersinonim dengan jumlah
baris yang akan ditampilkan per halaman.
Baik OFFSET maupun FETCH memiliki argumen tambahan yang harus disertakan di dalam
sintaks. Berikut ini menunjukkan contoh sintaks untuk menulis query paging:
SELECT <column list>
FROM <table name>
ORDER BY <column name>
OFFSET <rows to start on> ROWS
FETCH NEXT <number of rows to return> ROW ONLY
OFFSET berisi nilai bilangan bulat atau ekspresi yang menentukan permulaan baris serta
diikuti dengan keyword ROWS. FETCH memerlukan keyword NEXT, sebuah bilangan bulat atau
ekspresi yang menentukan jumlah baris yang akan dikembalikan, serta keyword ROWS.

2018 ©2018 STMIK Mikroskil. All rights reserved. 263


Chatrine Sylvia, Catherine Database Data & Information Mngt

MENULIS QUERY PAGING

1. Aktifkan editor query di SSMS.


2. Ketikkan dan jalankan kode T-SQL berikut ini.
USE AdventureWorks2012;
SELECT
ProductID,
ProductNumber,
Name AS ProductName,
ListPrice
FROM Production.Product
ORDER BY ProductID
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY

Gambar 5.28 | Hasil Execute Query Paging

Bagian paling penting dari query sebelumnya adalah harus didahului dengan klausa ORDER BY. Kolom
yang dinyatakan di dalam klausa ORDER BY menentukan urutan dan baris-baris yang akan
dikembalikan. Query berikut ini dimodifikasi dari query sebelumnya sehingga tidak dimulai dari baris
pertama, dimana nilai offset diganti menjadi 10.
USE AdventureWorks2012;
SELECT
ProductID,
ProductNumber,
Name AS ProductName,
ListPrice
FROM Production.Product
ORDER BY ProductID
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY

2018 ©2018 STMIK Mikroskil. All rights reserved. 264


Chatrine Sylvia, Catherine Database Data & Information Mngt

Gambar 5.29 | Hasil Execute Query Paging

Ketika nilai OFFSET diganti, perhatikan bahwa daftar produk yang baru akan dikembalikan.

MENANGANI KESALAHAN-KESALAHAN T-SQL

Sama seperti bahasa pemrograman lainnya, T-SQL menyediakan metoda yang elegan untuk
menangani kesalahan dan pengecualian selama eksekusi. T-SQL menggunakan keyword TRY...CATCH.
Ketika menulis TSQL, kode program diletakkan di dalam blok TRY, dan jika terjadi kesalahan, maka
kontrol akan dikirim ke blok CATCH. Di dalam blok CATCH harus dimasukkan kode T-SQL yang akan
menangani kesalahan. Berikut ini merupakan sintaks TRY...CATCH.
BEGIN TRY
{ sql_statement | statement_block }
END TRY
BEGIN CATCH
[{ sql_statement | statement_block }]
END CATCH
sql_statement merupakan pernyataan T-SQL tunggal dan statement_block merupakan
kumpulan atau batch dari pernyataan T-SQL. Kedua jenis tersebut diterapkan pada blok TRY dan
CATCH. Blok TRY dan CATCH harus dikonstruksi bersama.
Hanya kesalahan dengan tingkat keparahan antara 11 dan 19 yang menyebabkan blok CATCH
dijalankan. SQL Server memperlakukan kesalahan dengan tingkat keparahan yang lebih rendah
sebagai pesan informasional. Kesalahan dengan tingkat keparahan sebesar 20 atau lebih tinggi
biasanya akan memutuskan koneksi. Ketika koneksi terputus, SQL Server tidak akan menjalankan
kode T-SQL di dalam blok CATCH. Namun jika koneksi tidak terputus, maka SQL Server akan
menjalankan kode T-SQL di dalam blok CATCH.
Berikut ini beberapa fungsi skalar di dalam blok CATCH untuk memanggil kembali informasi
mengenai kesalahan yang menyebabkan dijalankannya blok CATCH, yaitu:
 ERROR_NUMBER(): mengembalikan angka kesalahan
 ERROR_MESSAGE(): mengembalikan penjelasan tekstual dari kesalahan INFORMASI

 ERROR_SEVERITY(): mengembalikan tingkat keparahan kesalahan


 ERROR_STATE(): mengembalikan state number kesalahan Dapat menggunakan
state number bersama
 ERROR_LINE(): mengembalikan line number dari pernyataan T-SQL dimana
dengan nomor kesalahan
kesalahan terjadi ketika mencari informasi
 ERROR_PROCEDURE(): mengembalikan nama dari stored procedure atau mengenai kesalahan di
trigger dimana kesalahan terjadi Knowledge Base.
Fungsi @@ERROR juga mengembalikan angka kesalahan apabila
pernyataan T-SQL sebelumnya memiliki kesalahan selama proses eksekusi.

2018 ©2018 STMIK Mikroskil. All rights reserved. 265


Chatrine Sylvia, Catherine Database Data & Information Mngt

Fungsi tersebut akan mengembalikan nilai 0 apabila pernyataan T-SQL sebelumnya dieksekusi tanpa
adanya kesalahan.
Microsoft SQL Server memperkenalkan pernyataan THROW yang menimbulkan pengecualian
dan mengirim eksekusi ke blok CATCH. Pernyataan THROW dapat digunakan bersama dengan blok
TRY untuk meningkatkan pengecualian dan mengirimkan eksekusi ke blok CATCH. Pernyataan THROW
harus diakhiri dengan tanda titik koma (;). Berikut sintaks pernyataan THROW.
SINTAKS THROW
THROW
[ { error_number | @local_variable },
{ message | @local_variable },
{ state | @local_variable }
] [ ; ]
Error_number harus di antara 50.000 dan 2.147.483.647 serta dapat berupa sebuah konstanta
atau variabel, namun bersifat opsional ketika mengimplementasikan penanganan kesalahan
menggunakan T-SQL. Message menjelaskan kesalahan dan dapat berupa sebuah string atau variabel.
State harus di antara 0 dan 255 serta dapat berupa sebuah konstanta atau variabel.
Pernyataan RAISERROR digunakan untuk menginstruksikan kepada SQL Server untuk
mengirimkan pesan kesalahan kepada aplikasi client. Pernyataan RAISERROR secara khusus digunakan
pada kesalahan user-defined. Sintaks pernyataan RAISERROR yaitu sebagai berikut.
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]

MENGIMPLEMENTASIKAN PENANGANAN KESALAHAN MENGGUNAKAN KONSTRU KSI


T-SQL

1. Aktifkan editor query di SSMS.


2. Ketikkan dan jalankan kode T-SQL berikut ini.
BEGIN TRY
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT @@ERROR AS [@@ERROR]
SELECT ERROR_NUMBER() AS [ERROR_NUMBER],
ERROR_MESSAGE() AS [ERROR_MESSAGE]
END CATCH

Gambar 5.30 | Hasil Execute Query Penanganan Kesalahan

2018 ©2018 STMIK Mikroskil. All rights reserved. 266


Chatrine Sylvia, Catherine Database Data & Information Mngt

Perhatikan bahwa query mengembalikan hasil kosong, namun yang terpenting adalah tidak
mengembalikan kesalahan. Daripada mengembalikan atau menampilkan kesalahan, blok CATCH
akan menangani kesalahan tersebut.

3. Di dalam blok CATCH, ketikkan pernyataan THROW.


BEGIN TRY
SELECT 1/0;
END TRY
BEGIN CATCH
THROW;
END CATCH

Gambar 5.31 | Hasil Execute Query Penanganan Kesalahan

Dengan menambah pernyataan THROW pada blok CATCH memaksa client untuk menampilkan
pesan kesalahan. THROW mengembalikan hasil yang lebih akurat dan pada kebanyakan kasus
menyediakan infromasi yang cukup bagi developer untuk secara efektif menangani kesalahan.

4. Jika ingin mengkustomisasi kesalahan yang disediakan oleh SQL Server, maka gantikan
pernyataan THROW pada langkah sebelumnya dengan pernyataan berikut.
BEGIN TRY
SELECT 1/0;
END TRY
BEGIN CATCH
THROW 51000, 'You divided my ZERO!!!', 1;
END CATCH

Gambar 5.32 | Hasil Execute Query Penanganan Kesalahan

Ketika query dieksekusi, pesan kesalahan yang dispesifikasikan dalam pernyataan THROW akan
ditampilkan.

KEYWORD UNTUK PENGON TROLAN ALIRAN (CONTROL-OF-FLOW)

Menentukan kapan dan bagaimana kode seharusnya bereaksi atau bekerja bersama
merupakan bagian yang penting dari setiap bahasa pemrograman. T-SQL menyertakan sekumpulan

2018 ©2018 STMIK Mikroskil. All rights reserved. 267


Chatrine Sylvia, Catherine Database Data & Information Mngt

keyword yang memungkinkan untuk mengelompokkan sederetan pernyataan dan membuat keputusan
run-time berdasarkan logika di dalam kode program. Keyword-keyword tersebut adalah:
 BEGIN...END  IF...ELSE
 BREAK  RETURN
 CONTINUE  WAITFOR
 GOTO  WHILE
 CASE
Secara teknis, blok TRY...CATCH dan pernyataan THROW termasuk keyword pengontrolan
aliran, namun pada bagian ini dihilangkan karena sudah dibahas pada bagian sebelumnya. Bagian
berikut ini akan membahas keyword BEGIN...END, IF...ELSE, CASE dan WHILE secara detil.

MENGGUNAKAN KEYWORD BEGIN… END

1. Aktifkan editor query di SSMS.


2. Ketikkan dan jalankan kode T-SQL berikut ini.
USE AdventureWorks2012;
BEGIN
DECLARE @StartingHireDate datetime = '12/31/2001'
SELECT
e.BusinessEntityID,
p.FirstName,
p.LastName,
e.HireDate
FROM HumanResources.Employee e
INNER JOIN Person.Person p
ON e.BusinessEntityID = p.BusinessEntityID
WHERE HireDate <= @StartingHireDate
END

Gambar 5.33 | Hasil Execute Query Keyword BEGIN... END

Pada query di atas, pertama kali sebuah variabel dideklarasikan dan diberi nilai. Variabel tersebut
kemudian digunakan untuk membatasi hasil query pada hanya pegawai yang tanggal rekrutnya lebih
kecil atau sama dengan nilai yang diberikan ke variabel.
Keyword BEGIN… END mengidentifikasi blok kode. Gabungan keyword BEGIN… END secara sederhana
berisi sekumpulan atau sederetan pernyataan T-SQL. Blok BEGIN… END dapat di-nested. Keyword
BEGIN… END juga digunakan untuk mengidentifikasi blok kode dalam klausa IF… ELSE, perulangan
WHILE, dan elemen CASE.
BEGIN
{ sql_Statement | statement_block }
END

MENGGUNAKAN EKSPRESI IF… ELSE

1. Aktifkan editor query di SSMS.

2018 ©2018 STMIK Mikroskil. All rights reserved. 268


Chatrine Sylvia, Catherine Database Data & Information Mngt

2. Ketikkan dan jalankan kode T-SQL berikut ini.


IF(DATENAME(M, GETDATE())='December')
BEGIN
SELECT 'Time for the holidays!!!!' Results
END
ELSE
BEGIN
SELECT 'Not sure what''s going on now :(' Results
END

Gambar 5.34 | Hasil Execute Query Ekspresi IF... ELSE

Jika bulan yang dikembalikan bukan bernilai December, maka ekspresi Boolean mengembalikan nilai
false dan kontrol akan dikirim ke blok ELSE serta pernyataan di dalam blok tersebut akan dieksekusi.
Ekspresi IF… ELSE secara sederhana memberitahukan bahasa pemrograman untuk melakukan sebuah
pernyataan T-SQL atau sekumpulan pernyataan jika kondisi tertentu dijumpai, atau sebuah
pernyataan T-SQL atau sekumpulan pernyataan jika kondisi sebaliknya. Secara sederhana blok IF…
ELSE digunakan untuk memproses keputusan berdasarkan ekspresi Boolean. IF dapat digunakan tanpa
ELSE, namun ELSE tidak dapat digunakan tanpa IF. Ekspresi IF… ELSE dapat di-nested, artinya sebuah
klausa IF atau ELSE dapat berisi struktur IF… ELSE yang lain.
IF Boolean_expression { sql_statement | statement_block }
[ ELSE { sql_statement | statement_block } ]

MENGGUNAKAN PERNYATA AN CASE

1. Aktifkan editor query di SSMS.


2. Ketikkan dan jalankan kode T-SQL berikut ini.
SELECT CASE (SELECT DATENAME(dw, GETDATE()))
WHEN 'Friday' THEN 'Thanks God Its Friday!!!'
WHEN 'Saturday' THEN 'Its Saturday yo!!!'
WHEN 'Sunday' THEN 'Chill, Its Sunday!!!'
ELSE 'Keep Calm and Wait For Holiday'
END Results;

INFORMASI

Ekspresi Boolean harus


mengembalikan
sebuah nilai baik
berupa nilai True, False
maupun Null. SQL
Server menganggap
nilai Null sebagai False.

Gambar 5.35 | Hasil Execute Query Pernyataan CASE

2018 ©2018 STMIK Mikroskil. All rights reserved. 269


Chatrine Sylvia, Catherine Database Data & Information Mngt

Bila nilai yang dikembalikan berupa ‘Friday’ maka akan memunculkan hasil ‘Thanks God Its
Friday!!!’, namun bila nilai yang dikembalikan berupa ‘Saturday’ maka akan memunculkan hasil ‘Its
Saturday yo!!!’, selanjutnya bila nilai yang dikembalikan berupa ‘Sunday’ maka akan memunculkan
hasil ‘Chill, Its Sunday!!!’. Apabila nilai yang dikembalikan bukan berupa ‘Friday’, ‘Saturday’, maupun
‘Sunday’, maka akan memunculkan hasil ‘Keep Calm and Wait For Holiday’ yaitu pada klausa ELSE.
Pernyataan CASE juga dipakai untuk membuat keputusan berdasarkan suatu ekspresi.
Pernyataan CASE merupakan cara yang lebih sederhana secara konseptual untuk menjalankan operasi
yang hampir mirip dengan IF… ELSE IF… ELSE.
CASE input_expression
WHEN test_result THEN statement_block
WHEN test_result THEN statement_block
...
[ELSE statement_block]
END
Parameter input_expression merupakan nilai yang diuji oleh pernyataan WHEN. Jika
parameter input_expression dipasangkan dengan pernyataan SELECT, maka harus ditutup dengan
pernyataan SELECT dalam kurung.

MENGGUNAKAN PERNYATAAN WHILE DENGAN BREAK DA N CONTINUE

1. Aktifkan editor query di SSMS.


2. Ketikkan dan jalankan kode T-SQL berikut ini.
DECLARE @count int = 0
WHILE (@count < 10)
BEGIN
SET @count = @count + 1;
IF(@count < 5)
BEGIN
SELECT @count AS Counter
CONTINUE;
END
ELSE
BREAK;
END

Gambar 5.36 | Hasil Execute Query Loop WHILE

Query sebelumnya menggunakan sebuah variabel di dalam ekspresi dari loop WHILE. Selama setiap
eksekusi dari loop, variabel akan dinaikkan nilainya sebesar satu, dan saat mencapai nilai 10, maka
loop akan keluar. Akan tetapi, karena adanya logika tambahan yang menyebabkan keluar dari loop

2018 ©2018 STMIK Mikroskil. All rights reserved. 270


Chatrine Sylvia, Catherine Database Data & Information Mngt

menggunakan BREAK jika variabel counter bernilai tidak lebih kecil dari lima, maka hasilnya hanya
berupa empat kali iterasi dari loop.
While merupakan mekanisme looping berdasarkan ekspresi Boolean. Selama hasil evaluasi ekspresi
bernilai true, pernyataan T-SQL tertentu atau blok kode program akan dieksekusi. Dua keyword yang
bersifat opsional, yaitu BREAK dan CONTINUE, dapat disertakan dengan keyword WHILE untuk
membantu dalam pengontrolan logika di dalam loop. Jika pada posisi manapun selama loop WHILE
dimana keyword BREAK menyebabkan eksekusi dari query keluar, maka kode T-SQL setelah keyword
END akan dieksekusi. Sebaliknya, keyword CONTINUE menyebabkan loop di-restart dan setiap
pernyataan setelah keyword CONTINUE akan diabaikan.
WHILE Boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }

2018 ©2018 STMIK Mikroskil. All rights reserved. 271


Chatrine Sylvia, Catherine Database Data & Information Mngt

UNIT SUMMARY
Mahasiswa mampu memahami metoda yang dapat digunakan untuk membantu dalam menggabungkan
data dari beberapa tabel, penggunaan variabel, penggunaan beberapa fungsi skalar built-in,
penggunaan operator PIVOT dan UNPIVOT, penggunaan teknik paging yang baru di Microsoft SQL
Server, dan penanganan kesalahan serta pengontrolan aliran dari query T-SQL

2018 ©2018 STMIK Mikroskil. All rights reserved. 272

Anda mungkin juga menyukai