SQL 服务器:正在创建派生列
SQL Server : creating derived column
以下是我正在处理的 table 的示例数据。我想创建一个新列 RenIndicator
,它有 3 个不同的值,这应该基于 NextPolicy
列然后是 Expiry date
列进行填充。
任何想法都会很好。在下面包括示例数据和我的预期结果。
新列 RenIndicator
,它具有三个可能值之一:Yes
、No
、N/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)。
以下是我正在处理的 table 的示例数据。我想创建一个新列 RenIndicator
,它有 3 个不同的值,这应该基于 NextPolicy
列然后是 Expiry date
列进行填充。
任何想法都会很好。在下面包括示例数据和我的预期结果。
新列 RenIndicator
,它具有三个可能值之一:Yes
、No
、N/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)。