原表資料圖:
表結構型別:
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.自定義函式不能有任何 函式 是指對具有函式外作用域 例如資料庫表...