Eksplorasi Kebutuhan Bisnis dengan Transact SQL

Eksplorasi Kebutuhan Bisnis dengan Transact SQL

 

Transact SQL memiliki kapabilitas query database relasional yang memiliki performance terbaik dalam hal akses data berbasis set oriented. Bila tertarik mengasah problem-problem dunia bisnis yang diterjemahkan ke dalam SQL, saya berikan kasus berikut ini.

 

Table Prefix barang (PrefixBarang)

 

KodePrefixBarang

Jenis

B01

Biskuit

M01

Mi Instan

R01

Roti

  

Table lookup

 

KodeLookup

LokasiPabrik

Biskuit

Mi Instant

Roti

A

Karawang

 

B

Bandung

 

 

C

Cimahi

   

 

Kode barang terdiri atas kombinasi PrefixBarang dan lookup, seperti :

B01A

B01B

B01C

M01A

M01B

M01C

R01A

R01C

 

Dari setiap kode barang diatas dikehendaki informasi lokasi pabrik sehingga

B01A à Karawang

B01B à NULL

B01C à NULL

M01A à NULL

M01B à Bandung

M01C à NULL

R01A à NULL

R01C à Cimahi

 

Diminta transact SQL dengan diketahui input kode prefix barang dan kode lookup untuk mendapatkan lokasi pabrik.

 

Yang jawabannya sesuai dengan yang diminta, saya kirimkan CD SQL Server 2008.

Share this post: | | | |
Published Tuesday, April 21, 2009 7:17 AM by Kasim.Wirama
Filed under:

Comments

# re: Eksplorasi Kebutuhan Bisnis dengan Transact SQL

Tuesday, April 21, 2009 11:24 AM by Ronas Tubagus Marnas

CREATE PROCEDURE [dbo].[sp_LokasiPabrik]

@KodeBarang varchar(4)

AS

BEGIN

SET NOCOUNT ON;

select LokasiPabrik  from PrefixBarang B

inner join [lookup] C

on B.Jenis = case when C.Biskuit = Convert(bit, 1) then cast('Biskuit' AS varchar)

                 when C.[Mi Instan] = Convert(bit, 1) then cast('Mi Instan' as varchar)

                 when C.Roti = Convert(bit, 1) then cast('Roti' AS varchar) else '' end

where B.KodePrefixBarang = LEFT(@KodeBarang, 3)

AND   C.KodeLookup = RIGHT(@KodeBarang, 1)

END

GO

--execute procedure

exec dbo.sp_LokasiPabrik 'B01A'

# re: Eksplorasi Kebutuhan Bisnis dengan Transact SQL

Tuesday, April 21, 2009 11:46 AM by raharja

DECLARE @KodePrefix varchar(10),

@KodeLookUp char(1)

SET @KodePrefix = 'B01';

SET @KodeLookUp = 'A';

SELECT KodeBarang, lu1.LokasiPabrik FROM (SELECT KodePrefixBarang + lu.KodeLookUp as KodeBarang, jenis, KodeLookUp FROM PrefixBarang pb CROSS JOIN dbo.LookUp lu ) as qry1 LEFT JOIN dbo.LookUp lu1 ON qry1.KodeLookUp=lu1.KodeLookUp AND ((qry1.jenis='Biskuit' AND lu1.Biskuit=1 ) OR

(qry1.jenis='Mi Instan' AND lu1.MieInstant=1) OR (qry1.jenis='Roti' AND lu1.Roti=1)) WHERE KodeBarang=@KodePrefix + @KodeLookUp

# re: Eksplorasi Kebutuhan Bisnis dengan Transact SQL

Tuesday, April 21, 2009 2:09 PM by mr_o

create PROCEDURE dbo.LokasiPabrik

@CodeBarang varchar(4)

AS

BEGIN

SET NOCOUNT ON;

select  PrefixBarang.KodePrefixBarang+unpvt.KodeLookup as CodeBarang,case when PrefixBarang.Jenis=unpvt.Jenis Then unpvt.LokasiPabrik else Null end as LokasiPabrik

from

(Select KodeLookup,LokasiPabrik,Biskuit,MiInstan,Roti  from lookup) a

unpivot (Nilai for Jenis in (Biskuit,MiInstan,Roti )) as unpvt cross join PrefixBarang

END

GO

exec dbo.LokasiPabrik 'MO1A'

# re: Eksplorasi Kebutuhan Bisnis dengan Transact SQL

Tuesday, April 21, 2009 4:27 PM by Mr. A

SELECT Lookup.LokasiPabrik

FROM Lookup, PrefixBarang

WHERE ((([PrefixBarang]![kodeprefixBarang])=[kodePrefix]) AND (([Lookup]![kodeLookup])=[KdLookup]) AND ((Lookup.KodeBarang)=[kodePrefix]+[KdLookup]));

# re: Eksplorasi Kebutuhan Bisnis dengan Transact SQL

Wednesday, April 22, 2009 8:40 AM by Kasim.Wirama

Terima kasih rekan-rekan community. Quiz ini saya tutup, dan saya akan review jawabannya. Pemenangnya akan saya umumkan paling lambat tanggal 27 April 2009 lewat postingan ini juga.

# re: Eksplorasi Kebutuhan Bisnis dengan Transact SQL

Wednesday, April 22, 2009 4:24 PM by peucang

SELECT    dbo.PrefixBarang.KodePrefixBarang+dbo.Lookup.KodeLookup as 'Kode',

CASE WHEN (jenis='Biskuit' AND Biskuit = 1)or(jenis='Mi Instant' AND dbo.Lookup.[Mi Instant] = 1)or(jenis='Roti' AND dbo.Lookup.[Roti] = 1) THEN dbo.Lookup.LokasiPabrik end as 'Lokasi Pabrik'

FROM         dbo.Lookup CROSS JOIN

                     dbo.PrefixBarang

# re: Eksplorasi Kebutuhan Bisnis dengan Transact SQL

Wednesday, April 22, 2009 4:40 PM by peucang

Create procedure LokasiPabrik @kode as nvarchar(4)

as

begin

SELECT    dbo.PrefixBarang.KodePrefixBarang+dbo.Lookup.KodeLookup as 'Kode',

CASE WHEN (jenis='Biskuit' AND Biskuit = 1)or(jenis='Mi Instant' AND dbo.Lookup.[Mi Instant] = 1)or(jenis='Roti' AND dbo.Lookup.[Roti] = 1) THEN dbo.Lookup.LokasiPabrik end as 'Lokasi Pabrik'

FROM         dbo.Lookup CROSS JOIN

                     dbo.PrefixBarang

where dbo.PrefixBarang.KodePrefixBarang+dbo.Lookup.KodeLookup = @kode

end

Go

exec LokasiPabrik 'B01A'

# re: Eksplorasi Kebutuhan Bisnis dengan Transact SQL

Monday, April 27, 2009 10:17 PM by lieur

mana jawabannya pa kasim

# re: Eksplorasi Kebutuhan Bisnis dengan Transact SQL

Monday, May 04, 2009 7:57 PM by Kasim.Wirama

setelah sekian lama tenggelam dalam kesibukan, hari ini baru menyempatkan diri untuk melihat query dari rekan2 komuniti. berikut skrip untuk populate record untuk kedua tabel :

use tempdb

go

create table dbo.PrefixBarang

(

KodePrefixBarang char(3) not null primary key,

Jenis  varchar(10) not null

)

on [primary];

go

create table dbo.[Lookup]

(

KodeLookup char(1) not null primary key,

LokasiPabrik varchar(10) not null,

Biskuit char(1) null,

[Mi Instant] char(1) null,

Roti char(1) null

)

on [primary];

go

insert into dbo.PrefixBarang (KodePrefixBarang, Jenis)

values ('B01','Biskuit');

insert into dbo.PrefixBarang (KodePrefixBarang, Jenis)

values ('M01','Mi Instant');

insert into dbo.PrefixBarang (KodePrefixBarang, Jenis)

values ('R01','Roti');

go

insert into dbo.[Lookup] (KodeLookup,LokasiPabrik,Biskuit,[Mi Instant],Roti)

values ('A','Karawang','V',null,null);

insert into dbo.[Lookup] (KodeLookup,LokasiPabrik,Biskuit,[Mi Instant],Roti)

values ('B','Bandung',null,'V',null);

insert into dbo.[Lookup] (KodeLookup,LokasiPabrik,Biskuit,[Mi Instant],Roti)

values ('C','Cimahi',null,null,'V');

go

script dari saya adalah sbb :

declare @kodePrefixBarang char(3);

declare @kodeLookup char(1);

select @kodePrefixBarang = 'B01', @kodeLookup = 'A';

WITH cte AS

(

SELECT

KodeLookup,

LokasiPabrik,

Biskuit,

[MI Instant],

roti

FROM dbo.[Lookup] AS l

WHERE KodeLookup = @kodeLookup

),

cte1 AS

(

SELECT

KodeLookup,

LokasiPabrik,

Jenis

FROM cte

UNPIVOT (V FOR Jenis IN (Biskuit, [Mi Instant], Roti)) AS U

)

SELECT MAX(cte1.lokasiPabrik)

FROM cte1

right outer join dbo.PrefixBarang as pb

on cte1.Jenis = pb.Jenis

and pb.KodePrefixBarang = @kodePrefixBarang;

go

script dari saudara Ronas Tubagus Marnas (sedikit saya edit untuk menyesuaikan struktur tabel di atas) adalah sbb :

declare

@KodeBarang varchar(4)

set @KodeBarang = 'B01A';

select LokasiPabrik  from PrefixBarang B

inner join [lookup] C

on B.Jenis = case when C.Biskuit = Convert(char, 'v') then cast('Biskuit' AS varchar)

                when C.[Mi Instant] = Convert(char, 'v') then cast('Mi Instant' as varchar)

                when C.Roti = Convert(char, 'v') then cast('Roti' AS varchar) else '' end

where B.KodePrefixBarang = LEFT(@KodeBarang, 3)

AND   C.KodeLookup = RIGHT(@KodeBarang, 1)

go

query dari Sdr. Raharja adalah :

DECLARE @KodePrefix varchar(10),

@KodeLookUp char(1)

SET @KodePrefix = 'b01';

SET @KodeLookUp = 'a';

SELECT KodeBarang, lu1.LokasiPabrik FROM

(SELECT KodePrefixBarang + lu.KodeLookUp as KodeBarang, jenis, KodeLookUp

FROM PrefixBarang pb

CROSS JOIN dbo.LookUp lu ) as qry1

left JOIN dbo.LookUp lu1 ON

qry1.KodeLookUp=lu1.KodeLookUp AND ((qry1.jenis='Biskuit' AND lu1.Biskuit='V' ) OR

(qry1.jenis='Mi Instant' AND lu1.[Mi Instant]='V') OR (qry1.jenis='Roti' AND lu1.Roti='V'))

WHERE KodeBarang=@KodePrefix + @KodeLookUp

go

query dari mr.o (saya tambahkan filter di where) adalah :

declare

@CodeBarang varchar(4);

select @CodeBarang = 'b01a';

select  PrefixBarang.KodePrefixBarang+unpvt.KodeLookup as CodeBarang,

case when PrefixBarang.Jenis=unpvt.Jenis

Then unpvt.LokasiPabrik else Null end as LokasiPabrik

from

(Select KodeLookup,LokasiPabrik,Biskuit,[Mi Instant],Roti  from lookup) a

unpivot (Nilai for Jenis in (Biskuit,[Mi Instant],Roti )) as unpvt cross join PrefixBarang

where PrefixBarang.KodePrefixBarang+unpvt.KodeLookup = @CodeBarang

go

query dari mr.A tidak bisa dieksekusi.

query dari saya sendiri, Ronas, Raharja, mr.O sama2 menghasilkan output yang diinginkan, lalu saya bandingkan efisiensi query lewat graphical execution plan, terlihat perbandingan sbb :

saya sendiri : 23%

Ronas        : 21%

Raharja      : 34%

Mr. O        : 22%

Kebetulan saya hanya memiliki 2 CD SQL Server 2008, jadi saya berikan kepada Sdr. Ronas, dan Mr. O (apa nama aslinya?). Silahkan Sdr. Ronas dan Mr. O menghubungi email saya di wkww2004@gmail.com.

Terima kasih.

Powered by Community Server (Commercial Edition), by Telligent Systems