代码之家  ›  专栏  ›  技术社区  ›  katy89

SQL Server:创建派生列

  •  1
  • katy89  · 技术社区  · 7 年前

    下面是我正在处理的表的示例数据。我想创建一个新列 RenIndicator 有3个不同的值,应根据 NextPolicy 列,然后 Expiry date

    任何想法都是好的。包括下面的示例数据和我的预期结果。

    新建列 RenIndicator公司 它有三个可能的值之一: Yes , No , N/a yet .

    -当 下一个政策 具有保单编号(&N); 到期日 是当前日期之前的

    -当 下一个政策 列没有任何值(&A);这个 到期日 小于当前日期

    还没有 -当 下一个政策 列没有任何值(&A);这个 到期日 大于当前日期

    我看起来更像这样

                    select a.*, 
                            case when a.NextPolicy <> NULL and NewRenewal = 'New' then 'Renewal' ELSE
                             when a.NextPolicy = NULL and ExpiryDate > GETDATE() then 'Not Availble Yet' ELSE
                            when a.NextPolicy = NULL and ExpiryDate < GETDATE() then 'Not Availble Yet' 
                            end as 'Renewal Indicator'  
                            from final a 
    

    样本数据:

    --===== If the test table already exists, drop it
    IF OBJECT_ID('TempDB..#mytable') IS NOT NULL
        DROP TABLE #mytable
    
    --===== Create the test table with 
    CREATE TABLE #mytable 
    (
        Region nvarchar(300), 
        NextPolicy nvarchar(300),
        CurrentPolicyNumber nvarchar(300),
        PolicyNumber nvarchar(100), 
        NewRenewal nvarchar(100), 
        EffectiveDate Date, 
        ExpiryDate Date, 
        Coverage nvarchar(100), 
        InsuredName nvarchar(300)
    )
    
    SET DATEFORMAT DMY
    
    --===== Insert the test data into the test table
    INSERT INTO #mytable (Region, NextPolicy, CurrentPolicyNumber, PolicyNumber, NewRenewal, EffectiveDate, ExpiryDate, Coverage, InsuredName)
        SELECT 'Asia', '47-ACA-000001-02', '47-ACA-000001-01', '000001', 'New', '2016-12-25', '2017-12-25', '', 'CPC Corporation, Taiwan (CPC)' 
        UNION ALL
        SELECT 'Asia', '', '47-ACA-000001-02', '000001', 'Renewal', '2017-12-25', '2018-12-25', '', 'CPC Corporation, Taiwan (CPC)' 
        UNION ALL
        SELECT 'North America', '42-XPR-000001-02', '42-PRP-000001-01', '000001', 'New', '2013-05-15', '2014-05-15', 'PRP', 'AvalonBay Communities,Inc.' 
        UNION ALL
        SELECT 'North America', '42-XPR-000001-03', '42-XPR-000001-02', '000001', 'Renewal', '2014-05-15', '2015-05-15', 'XPR', 'AvalonBay Communities, Inc.' 
        UNION ALL
        SELECT 'North America', '42-XPR-000001-04', '42-XPR-000001-03', '000001', 'Renewal', '2015-05-15', '2016-05-15', 'XPR', 'AvalonBay Communities, Inc.' 
        UNION ALL
        SELECT 'North America', '', '42-XPR-000001-04', '000001', 'Renewal', '2016-05-15', '2017-05-15', 'XPR', 'AvalonBay Communities, Inc.' 
        UNION ALL
                         SELECT 'Asia',         '47-ABA-000001-02','47-ABA-000001-01','000001','New',       '2015-11-25',   '2016-11-25','','Taiwan' UNION ALL
                         SELECT 'Asia',         '','47-ABA-000001-02','000001','Renewal','2016-11-25','2017-11-25','','Taiwan'
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Jacob H    7 年前

    这可以使用case语句完成:

    SELECT *
         , CASE WHEN NextPolicy <> '' AND ExpiryDate < CAST(GETDATE() AS DATE) THEN 'Yes'
                WHEN NextPolicy = '' AND ExpiryDate < CAST(GETDATE() AS DATE) THEN 'No'
                WHEN NextPolicy = '' AND ExpiryDate >  CAST(GETDATE() AS DATE) THEN 'N/a yet'
           END AS RenIndicator
    FROM #mytable
    

    我使用了空字符串 '' 对于“没有任何值”要求,但是如果这些字段中有空值,则需要执行以下操作 ISNULL(NextPolicy, '') 在这种情况下要对他们进行解释。

    我们假设任何值也是有效的策略号。根据需要,可以包括其他数据验证。

    还有即将到来的“编辑挂起”更多关于ExpiryDate是今天的日期时会发生什么的信息。

        2
  •  1
  •   Thom A    7 年前

    可能地

    ALTER TABLE #mytable ADD RenIndicator AS CASE WHEN NULLIF(NextPolicy,'') IS NOT NULL AND ExpiryDate < GETDATE() THEN 'Yes'
                                                  WHEN NULLIF(NextPolicy,'') IS NULL AND ExpiryDate < GETDATE() THEN 'No'
                                                  WHEN NULLIF(NextPolicy,'') IS NULL THEN 'N/A yet'
                                             END;
    

    然而,这将返回 NULL 如果 NextPolicy 确实有价值,续订日期是在将来。

    我注意到你的样本数据 '' 而不是 无效的 显示缺少数据,因此我使用 NULLIF ,以防万一,但是,您可以简单地将此更改为 = '' <> '' 或删除 NULLIF .

    我还根据您的陈述假设“我希望创建一个新的专栏 RenIndicator “实际上,您的意思是创建一个新列(改变表的DDL)。