SQL 05 自定義函式 處理表行 換列

2022-08-02 04:36:12 字數 2826 閱讀 8423

原表資料圖:

表結構型別:

ponumber varchar(10),process_id varchar(10),inp_opt_date varchar(16)

需要展示的效果圖:

由於這個表是需要隨時取出,隨時呼叫,所以決定選用函式來實現。

由於是字串,不是數字,用case when 的 sum 合併 顯然行不通,每個日期都需要經過單獨查詢得出,根據他們的 公共性 構造乙個基礎返回日期函式:

code

create

function

process_to_optdate(

@ponumber

varchar(50

),@process_id

varchar(10

))returns

datetime

--注意是returns而不是return

asbegin

declare

@redate

datetime

select

@redate

=convert

(datetime

,inp_opt_date)  

from

tbl_process_tracking 

where

process_id

=@process_id

andponumber

=@ponumber

--雖然原表是字串,但滿足日期格式,所有可以直接轉換日期  

return

@redate

end測試 sql:

code

select

dbo.process_to_optdate(

'100001',

'p0205')

--記住dbo.函式名稱 否則報錯 'process_to_optdate' is not a recognized built-in function name.

準備工作完成,構建臨時表:

create

function

processdate(

@ponumber

varchar(50

))returns

@mytable

table

(ponumber 

varchar(10

),preclearance_date 

datetime

,transportation_date 

datetime

,bonded_date 

datetime

,port_date 

datetime)--

自定義變數表

asbegin

insert

into

@mytable

select

@ponumber

,dbo.process_to_optdate(

@ponumber,'

p02035

'),dbo.process_to_optdate(

@ponumber,'

p0204

'),dbo.process_to_optdate(

@ponumber,'

p0205

'), dbo.process_to_optdate(

@ponumber,'

p0202

')   

return

--沒帶變數表

end測試臨時表函式:

code

select

*from

processdate(

'100001')

總結: 返回表和返回值的函式呼叫是不同的,而函式表更像一張真實表。

拓展,像上面那樣每次都要輸入ponumber對於想關聯表,多ponumber對映,顯然不能滿足要求,特拓展如下:

code

alter

function

[dbo].

[processdate]()

returns

@mytable

table

(ponumber 

varchar(10

),preclearance_date 

datetime

,transportation_date 

datetime

,bonded_date 

datetime

,port_date 

datetime)as

begin

insert

into

@mytable

select

ponumber,dbo.process_to_optdate(ponumber,

'p0203

'),dbo.process_to_optdate(ponumber,

'p0204

'),dbo.process_to_optdate(ponumber,

'p0205

'), dbo.process_to_optdate(ponumber,

'p0202')

from

tbl_process_tracking 

group

byponumber

--請給表加上索引,否則速度很慢 經測試6637的資料不加索引,是56s,而加了索引幾乎是0s,效果很明顯

return

end這樣就把整個縱向表演化成乙個橫向表。

SQL自定義函式

建立使用者自定義函式 標量函式 create function dbo.bmrs bmh as int returns int asbegin declare bmrs int select bmrs count 工號 from 銷售人員where 部門號 bmh return bmrs endgo...

sql 自定義函式

delimiter create definer function woshow try aid bigint returns bigint 20 language sql not deterministic sql security comment string begin if aid 0 th...

SQL自定義函式

自定義函式與儲存過程的區別 存在的意義 1.能夠在select等sql語句中直接使用自定義函式,儲存過程不行。2.自定義函式可以呼叫其他函式,也可以呼叫自己 遞迴 3.可以在表列和check 約束中使用自定義函式來實現特殊列或約束 4.自定義函式不能有任何 函式 是指對具有函式外作用域 例如資料庫表...