WP Remix
Nop Pinyowanichaka | ก้าวสั้นๆ ในวันเบาๆ ของผม
26
Mar

เขียน MSSQL store procedure เพื่อทำ Crosstab หรือ Pivot Table

วันก่อน มีโอกาสต้องเขียน การแสดงผลข้อมูลเป็นแบบ แนวนอน หรือที่เค้าเรียกกันว่า Crosstab แต่เนื่องด้วย ฐานข้อมูลที่ใช้ มันเป็น MSSQL 2000 มันไม่มีพวก Pivot Table มาให้ (Access ยังมีเลย) เลยต้องหาเอาเอง ไปเจอเว็บนึงเค้า เขียนเป็น Store Procedure ไว้ เอามาใช้ Work เลยทีเดียว ตอบโจทย์ได้เลย

ตัวอย่างของ Data

Year Region Income
Y2007 North 20
Y2007 South 10
Y2007 East 30
Y2006 North 10

Y2006 South 10

Y2006 East 10

เมื่อทำ Crosstab แล้วจะได้แบบนี้

Year North South East
Y2006 10 10 10
Y2007 20 10 30

อ้าวแล้วทำยังไงให้ได้แบบนี้ล่ะ มาดูวิธีการกันเลยครับ

เขียน Store Proc ดังนี้

CREATE     PROC sp_CrossTab
  @TABLE       AS sysname,        -- Table to crosstab
  @onrows      AS nvarchar(128),  -- Grouping key values (on rows)
  @onrowsalias AS sysname = NULL, -- Alias for grouping column
  @oncols      AS nvarchar(128),  -- Destination columns (on columns)
  @sumcol      AS sysname = NULL  -- Data cells
AS
 
DECLARE
  @sql AS varchar(8000),
  @NEWLINE AS char(1)
 
SET @NEWLINE = CHAR(10)
 
-- step 1: beginning of SQL string
SET @sql =
  'SELECT' + @NEWLINE +
  '  ' + @onrows +
  CASE
    WHEN @onrowsalias IS NOT NULL THEN ' AS ' + @onrowsalias
    ELSE ''
  END
 
CREATE TABLE #keys(keyvalue nvarchar(100) NOT NULL PRIMARY KEY)
 
DECLARE @keyssql AS varchar(1000)
SET @keyssql =
  'INSERT INTO #keys ' +
  'SELECT DISTINCT CAST(' + @oncols + ' AS nvarchar(100)) ' +
  'FROM ' + @TABLE
 
EXEC (@keyssql)
 
DECLARE @KEY AS nvarchar(100)
SELECT @KEY = MIN(keyvalue) FROM #keys
 
WHILE @KEY IS NOT NULL
BEGIN
  SET @sql = @sql + ','                   + @NEWLINE +
    '  SUM(CASE CAST(' + @oncols +
                     ' AS nvarchar(100))' + @NEWLINE +
    '        WHEN N''' + @KEY +
           ''' THEN ' + CASE
                          WHEN @sumcol IS NULL THEN '1'
                          ELSE @sumcol
                        END + @NEWLINE +
    '        ELSE 0'                      + @NEWLINE +
    '      END) AS D' + @KEY
 
  SELECT @KEY = MIN(keyvalue) FROM #keys
  WHERE keyvalue > @KEY
END
 
SET @sql = @sql         + @NEWLINE +
  'FROM ' + @TABLE      + @NEWLINE +
  'GROUP BY ' + @onrows + @NEWLINE +
  'ORDER BY ' + @onrows
 
 PRINT @sql  + @NEWLINE -- For debug
EXEC (@sql)

ใน Database Master (เพื่อเรียกใ้ช้ได้ทุก Database แบบง่ายๆหน่อย)

วิธีเรียกใช้งานก็

EXEC sp_crosstab
@table = ‘ชื่อ Table ที่ต้องการสร้าง Crosstab จากมัน’,
@onrows = ‘Field ที่ต้องการเอามาเป็น Row’,
@oncols = ‘Field ที่ต้องการเอามาเป็น Column’,
@sumcol = ‘Field ที่ต้องการเอามาเป็น จำนวนรวม’

แค่นี้เราก็สามารถสร้าง ตาราง Crosstab ได้อย่างง่ายๆ แล้วครับ

Category : MSSQL

Comments

aonjeera Jan 27, 2009

งงนิดหน่อยค่ะ :?: อยากให้อธิบายละเอียดกว่านี้ :shock:

นพ Jan 27, 2009

สงสัยส่วนไหนคัพ ส่วน code query หรือว่า ส่วนการแสดงผลอะคัพ

เม้นท์กันซะหน่อย