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)
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
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.
SINTAKS JOIN
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.
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
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.
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.
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.
Tergantung pada tipe OUTER JOIN, sintaksnya mirip dengan INNER JOIN. Keyword INNER
digantikan dengan LEFT OUTER atau RIGHT OUTER maupun FULL OUTER.
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.
FROM Purchasing.ProductVendor pv
FULL OUTER JOIN Sales.SalesOrderDetail sod
ON pv.ProductID = sod.ProductID
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.
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.
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.
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
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>
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.
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.
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.
USE AdventureWorks2012;
SELECT *
FROM Sales.SalesOrderDetail
WHERE ProductID = 777;
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.
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
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).
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
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).
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.
Gambar 5.20 | Hasil Execute Query Melakukan Perhitungan dan Validasi Tanggal
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
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
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.
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.
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.
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.
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.
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
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.
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.
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,
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.
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.
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
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.
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).
7. Jalankan query di atas. Setiap baris merepresentasikan jumlah penjualan yang dilakukan pada
masing-masing pelanggan.
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.
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
Ketika nilai OFFSET diganti, perhatikan bahwa daftar produk yang baru akan dikembalikan.
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
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 ] ]
Perhatikan bahwa query mengembalikan hasil kosong, namun yang terpenting adalah tidak
mengembalikan kesalahan. Daripada mengembalikan atau menampilkan kesalahan, blok CATCH
akan menangani kesalahan tersebut.
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
Ketika query dieksekusi, pesan kesalahan yang dispesifikasikan dalam pernyataan THROW akan
ditampilkan.
Menentukan kapan dan bagaimana kode seharusnya bereaksi atau bekerja bersama
merupakan bagian yang penting dari setiap bahasa pemrograman. T-SQL menyertakan sekumpulan
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.
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
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 } ]
INFORMASI
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.
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
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 }
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