SQL 服务器:正在创建派生列

SQL Server : creating derived column

以下是我正在处理的 table 的示例数据。我想创建一个新列 RenIndicator,它有 3 个不同的值,这应该基于 NextPolicy 列然后是 Expiry date 列进行填充。

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

新列 RenIndicator,它具有三个可能值之一:YesNoN/a yet

- 当 NextPolicy 有保单编号且 Expiry date 是当前日期

之前

No - 当 NextPolicy 列没有任何值且 Expiry date 小于当前日期

N/A yet - 当 NextPolicy 列没有任何值且 Expiry date 大于当前日期时

我正在寻找更像这样的查询

                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'

这可以使用 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

我为 "does not have any value" 要求使用了空字符串 '',但是如果您在这些字段中有 NULLS,则需要在 CASE 中执行类似 ISNULL(NextPolicy, '') 的操作以考虑到他们。

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

关于当 ExpiryDate 是今天的日期时会发生什么的更多信息,即将进行编辑。

可能...

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;

然而,这将 return NULL 如果 NextPolicy 确实有一个值并且续订日期在未来。

我注意到您的示例数据中有 '',而不是 NULL 来显示缺少数据,因此我使用了 NULLIF,但为了以防万一,您可以简单地将其更改为 = ''<> '' 或删除 NULLIF.

我还根据你的陈述假设 "I looking to create a new column RenIndicator" 你实际上是想创建一个新列(更改为 table 的 DDL)。