zoukankan      html  css  js  c++  java
  • SQL 05 自定义函数 处理表行 换列

    原表数据图:

     

    表结构类型:

       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

    测试 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)
    -- 自定义变量表
    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')

    总结: 返回表和返回值的函数调用是不同的,而函数表更像一张真实表。

    拓展,像上面那样每次都要输入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

      这样就把整个纵向表演化成一个横向表。

  • 相关阅读:
    Eclipse svn插件包
    最新版STS因为JDK版本太低无法启动的解决办法
    maven 项目无法发布,无法编译的解决办法
    maven依赖本地非repository中的jar包
    微信公众平台开发(2)-消息封装
    微信公众平台开发(4)-自定义菜单
    限制必须使用微信打开网页
    移动设备页面自适应
    微信公众平台开发(5)-上传下载多媒体文件
    微信公众平台开发(3)-回复消息
  • 原文地址:https://www.cnblogs.com/kinms/p/1375471.html
Copyright © 2011-2022 走看看