原表数据图:
表结构类型:
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
as
begin
declare @ReDate datetime
select @ReDate=convert(datetime,Inp_Opt_Date) from Tbl_Process_Tracking where Process_ID=@Process_ID and PONumber=@PONumber
-- 虽然原表是字符串,但满足日期格式,所有可以直接转换日期
return @ReDate
end
create function Process_To_OptDate(@PONumber varchar(50),@Process_ID varchar(10))
returns datetime --注意是returns而不是return
as
begin
declare @ReDate datetime
select @ReDate=convert(datetime,Inp_Opt_Date) from Tbl_Process_Tracking where Process_ID=@Process_ID and PONumber=@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.
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)
-- 自定义变量表
as
begin
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
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,'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')
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 by PONumber
-- 请给表加上索引,否则速度很慢 经测试6637的数据不加索引,是56s,而加了索引几乎是0s,效果很明显
RETURN
end
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 by PONumber
-- 请给表加上索引,否则速度很慢 经测试6637的数据不加索引,是56s,而加了索引几乎是0s,效果很明显
RETURN
end
这样就把整个纵向表演化成一个横向表。