Query menampilkan 1 data dari 2 data yang kembar

Jika kueri yang digabungkan sangat berbeda, bidang output harus menggabungkan data dari tipe yang berbeda. Jika demikian, kueri gabungan seringkali hanya mengembalikan hasil sebagai tipe data teks karena tipe data tersebut dapat berisi teks dan angka.

Untuk memahami cara kerjanya, kami akan menggunakan kueri gabungan Transaksi Produk dalam contoh database Northwind. Buka contoh database, lalu buka kueri Transaksi Produk dalam tampilan lembar data. Sepuluh data terakhir seharusnya mirip dengan output ini:

ID Produk

Tanggal Pemesanan

Nama Perusahaan

Transaksi

Jumlah

77

22/1/2006

Pemasok B

Pembelian

60

80

22/1/2006

Pemasok D

Pembelian

75

81

22/1/2006

Pemasok A

Pembelian

125

81

22/1/2006

Pemasok A

Pembelian

200

7

20/1/2006

Perusahaan D

Penjualan

10

51

20/1/2006

Perusahaan D

Penjualan

10

80

20/1/2006

Perusahaan D

Penjualan

10

34

15/1/2006

Perusahaan AA

Penjualan

100

80

15/1/2006

Perusahaan AA

Penjualan

30

Anggap saja Anda ingin bidang Jumlah dipisahkan menjadi dua, yaitu Beli dan Jual. Anda juga ingin mengisi nilai nol tetap untuk bidang tanpa nilai. Berikut tampilan SQL untuk kueri gabungan ini:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell FROM [Product Orders] UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell FROM [Product Purchases] ORDER BY [Order Date] DESC; 

Jika beralih ke tampilan lembar data, Anda akan melihat sepuluh data terakhir ditampilkan seperti berikut:

ID Produk

Tanggal Pemesanan

Nama Perusahaan

Transaksi

Beli

Jual

74

22/1/2006

Pemasok B

Pembelian

tanggal

0

77

22/1/2006

Pemasok B

Pembelian

60

0

80

22/1/2006

Pemasok D

Pembelian

75

0

81

22/1/2006

Pemasok A

Pembelian

125

0

81

22/1/2006

Pemasok A

Pembelian

200

0

7

20/1/2006

Perusahaan D

Penjualan

0

10

51

20/1/2006

Perusahaan D

Penjualan

0

10

80

20/1/2006

Perusahaan D

Penjualan

0

10

34

15/1/2006

Perusahaan AA

Penjualan

0

100

80

15/1/2006

Perusahaan AA

Penjualan

0

30

Masih dengan contoh ini, bagaimana jika Anda ingin bidang dengan nilai nol menjadi kosong? Anda dapat mengubah SQL agar tidak menampilkan apa pun sebagai ganti nilai nol dengan menambahkan kata kunci Null seperti berikut:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell FROM [Product Orders] UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell FROM [Product Purchases] ORDER BY [Order Date] DESC;

Namun, seperti yang dapat dilihat jika beralih ke tampilan lembar data, kini Anda memiliki hasil yang tidak terduga. Dalam kolom Beli, setiap bidang kosong:

ID Produk

Tanggal Pemesanan

Nama Perusahaan

Transaksi

Beli

Jual

74

22/1/2006

Pemasok B

Pembelian

77

22/1/2006

Pemasok B

Pembelian

80

22/1/2006

Pemasok D

Pembelian

81

22/1/2006

Pemasok A

Pembelian

81

22/1/2006

Pemasok A

Pembelian

7

20/1/2006

Perusahaan D

Penjualan

10

51

20/1/2006

Perusahaan D

Penjualan

10

80

20/1/2006

Perusahaan D

Penjualan

10

34

15/1/2006

Perusahaan AA

Penjualan

100

80

15/1/2006

Perusahaan AA

Penjualan

30

Hal ini terjadi karena Access menentukan tipe data bidang dari kueri pertama. Dalam contoh ini, Null bukanlah angka.

Oleh karena itu, apa yang terjadi jika Anda mencoba dan menyisipkan string kosong untuk nilai bidang yang kosong? SQL untuk percobaan ini dapat terlihat seperti ini:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell FROM [Product Orders] UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell FROM [Product Purchases] ORDER BY [Order Date] DESC;

Saat Anda beralih ke tampilan lembar data, Anda akan melihat bahwa Access mengambil nilai beli, namun ia mengonversinya menjadi teks. Anda bisa mengatakan ini adalah nilai teks karena rata kiri dalam tampilan lembar data. String kosong dalam kueri pertama bukan angka yang menyebabkan Anda melihat hasil ini. Anda juga akan melihat bahwa nilai jual juga dikonversi menjadi teks karena catatan pembelian berisi string kosong.

ID Produk

Tanggal Pemesanan

Nama Perusahaan

Transaksi

Beli

Jual

74

22/1/2006

Pemasok B

Pembelian

tanggal

77

22/1/2006

Pemasok B

Pembelian

60

80

22/1/2006

Pemasok D

Pembelian

75

81

22/1/2006

Pemasok A

Pembelian

125

81

22/1/2006

Pemasok A

Pembelian

200

7

20/1/2006

Perusahaan D

Penjualan

10

51

20/1/2006

Perusahaan D

Penjualan

10

80

20/1/2006

Perusahaan D

Penjualan

10

34

15/1/2006

Perusahaan AA

Penjualan

100

80

15/1/2006

Perusahaan AA

Penjualan

30

Lalu, bagaimana cara memecahkan teka-teki ini?

Solusinya adalah memaksa kueri untuk menganggap nilai bidang menjadi angka. Hal ini dapat dilakukan dengan ekspresi:

IIf(False, 0, Null)

Syarat untuk diperiksa, False, tidak akan menjadi True, maka ekspresi tersebut akan selalu mengembalikan Null, tetapi Access masih mengevaluasi kedua opsi output dan menentukan output menjadi angka atau Null.

Berikut cara menggunakan ekspresi ini dalam contoh yang dapat dimodifikasi:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell FROM [Product Orders] UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell FROM [Product Purchases] ORDER BY [Order Date] DESC;

Perlu diingat bahwa mengubah kueri kedua tidak harus dilakukan.

Jika beralih ke tampilan lembar data, Anda akan melihat hasil yang diinginkan:

ID Produk

Tanggal Pemesanan

Nama Perusahaan

Transaksi

Beli

Jual

74

22/1/2006

Pemasok B

Pembelian

tanggal

77

22/1/2006

Pemasok B

Pembelian

60

80

22/1/2006

Pemasok D

Pembelian

75

81

22/1/2006

Pemasok A

Pembelian

125

81

22/1/2006

Pemasok A

Pembelian

200

7

20/1/2006

Perusahaan D

Penjualan

10

51

20/1/2006

Perusahaan D

Penjualan

10

80

20/1/2006

Perusahaan D

Penjualan

10

34

15/1/2006

Perusahaan AA

Penjualan

100

80

15/1/2006

Perusahaan AA

Penjualan

30

Metode alternatif untuk mendapatkan hasil yang sama adalah menambahkan kueri dalam kueri gabungan dengan kueri lainnya pada bagian awal:

SELECT 0 As [Product ID], Date() As [Order Date], "" As [Company Name], "" As [Transaction], 0 As Buy, 0 As Sell FROM [Product Orders] WHERE False

Untuk setiap bidang, Access mengembalikan nilai tetap dari tipe data yang ditentukan. Tentu saja, Anda tidak ingin output kueri ini mengganggu hasilnya, sehingga Anda perlu menyertakan klausul WHERE ke False:

WHERE False

Ini trik sederhana karena selalu bersifat false dan kueri tidak mengembalikan apa pun. Gabungkan pernyataan ini dengan SQL yang ada dan pernyataan lengkap telah berhasil dibuat, yaitu:

SELECT 0 As [Product ID], Date() As [Order Date], "" As [Company Name], "" As [Transaction], 0 As Buy, 0 As Sell FROM [Product Orders] WHERE False UNION SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell FROM [Product Orders] UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell FROM [Product Purchases] ORDER BY [Order Date] DESC;

Catatan: Kueri yang digabungkan dalam contoh ini yang menggunakan database Northwind mengembalikan 100 data, sementara dua kueri individu mengembalikan 58 dan 43 data untuk total data sebanyak 101. Perbedaan ini terjadi karena dua catatan tidak bersifat unik. Lihat bagian Bekerja dengan data yang berbeda dalam kueri gabungan menggunakan UNION ALL untuk mempelajari cara mengatasi skenario ini dengan menggunakan UNION ALL.