SQL 中具有年度术语列的单个客户行
Single customer row with annual term columns in SQL
我正在从 SQL 中的 table 中提取客户编号和续订日期(保单期限开始日期),并尝试为每个客户生成一个新的 table 一行.
如果我只提取客户编号和期限生效日期,我会为每个客户的每个唯一期限日期获取多行:
例如
-customer 1 5/12/2016
-customer 1 5/12/2017
-customer 2 8/27/2012
-customer 2 8/27/2013
-customer 2 8/27/2014
-customer 2 8/27/2015
-customer 2 8/27/2016
-customer 2 8/27/2017
-customer 3 3/25/2012
-customer 3 3/25/2013
-customer 3 3/25/2014
-customer 3 3/25/2015
我想自动生成数据,其中每个客户都在一行中,多列代表他们各自任期的年份。例如:
-customer 1 5/12/2016
-customer 2 8/27/2012 8/27/2013 8/27/2014 8/27/2015 8/27/2016
-customer 3 3/25/2012 3/25/2013 3/25/2014 3/25/2015
我在 SQL 中的代码如下所示:
SELECT
CUSTOMER,
case when Year(TERM_EFFECTIVE_DATE) = 2012 then TERM_EFFECTIVE_DATE end as "2012",
case when Year(TERM_EFFECTIVE_DATE) = 2013 then TERM_EFFECTIVE_DATE end as "2013",
等等
但我的输出为每个客户提供多行,并在年份不匹配的列中提供空值。例如:
-customer 1 N/A N/A N/A N/A 5/12/2016
-customer 1 N/A N/A N/A N/A N/A
-customer 2 8/27/2012 N/A N/A N/A N/A
-customer 2 N/A 8/27/2013 N/A N/A N/A
-customer 2 N/A N/A 8/27/2014 N/A N/A
-customer 2 N/A N/A N/A 8/27/2015 N/A
-customer 2 N/A N/A N/A N/A 8/27/2016
-customer 2 N/A N/A N/A N/A N/A
-customer 3 3/25/2012 N/A N/A N/A N/A
-customer 3 N/A 3/25/2013 N/A N/A N/A
-customer 3 N/A N/A 3/25/2014 N/A N/A
-customer 3 N/A N/A N/A 3/25/2015 N/A
-customer 3 N/A N/A N/A N/A 3/25/2016
有什么方法可以解决此问题并将行数减少为每个客户一行?
形成一行的一种方法是进行外部查询,这样您就可以按客户对上一步中获得的结果进行分组:
select customer, max("2012") "2012", max("2013") "2013" -- so on so on for every year
from (
--your existing query
) details
group by customer
选项 2
或者,只需在原始查询中执行最大和分组:
select customer,
max(case when Year(TERM_EFFECTIVE_DATE) = 2012 then TERM_EFFECTIVE_DATE end) as "2012",
max(case when Year(TERM_EFFECTIVE_DATE) = 2013 then TERM_EFFECTIVE_DATE end) "2013" -- so on so on for every year
from
...
group by customer
我正在从 SQL 中的 table 中提取客户编号和续订日期(保单期限开始日期),并尝试为每个客户生成一个新的 table 一行.
如果我只提取客户编号和期限生效日期,我会为每个客户的每个唯一期限日期获取多行: 例如
-customer 1 5/12/2016
-customer 1 5/12/2017
-customer 2 8/27/2012
-customer 2 8/27/2013
-customer 2 8/27/2014
-customer 2 8/27/2015
-customer 2 8/27/2016
-customer 2 8/27/2017
-customer 3 3/25/2012
-customer 3 3/25/2013
-customer 3 3/25/2014
-customer 3 3/25/2015
我想自动生成数据,其中每个客户都在一行中,多列代表他们各自任期的年份。例如:
-customer 1 5/12/2016
-customer 2 8/27/2012 8/27/2013 8/27/2014 8/27/2015 8/27/2016
-customer 3 3/25/2012 3/25/2013 3/25/2014 3/25/2015
我在 SQL 中的代码如下所示:
SELECT
CUSTOMER,
case when Year(TERM_EFFECTIVE_DATE) = 2012 then TERM_EFFECTIVE_DATE end as "2012",
case when Year(TERM_EFFECTIVE_DATE) = 2013 then TERM_EFFECTIVE_DATE end as "2013",
等等
但我的输出为每个客户提供多行,并在年份不匹配的列中提供空值。例如:
-customer 1 N/A N/A N/A N/A 5/12/2016
-customer 1 N/A N/A N/A N/A N/A
-customer 2 8/27/2012 N/A N/A N/A N/A
-customer 2 N/A 8/27/2013 N/A N/A N/A
-customer 2 N/A N/A 8/27/2014 N/A N/A
-customer 2 N/A N/A N/A 8/27/2015 N/A
-customer 2 N/A N/A N/A N/A 8/27/2016
-customer 2 N/A N/A N/A N/A N/A
-customer 3 3/25/2012 N/A N/A N/A N/A
-customer 3 N/A 3/25/2013 N/A N/A N/A
-customer 3 N/A N/A 3/25/2014 N/A N/A
-customer 3 N/A N/A N/A 3/25/2015 N/A
-customer 3 N/A N/A N/A N/A 3/25/2016
有什么方法可以解决此问题并将行数减少为每个客户一行?
形成一行的一种方法是进行外部查询,这样您就可以按客户对上一步中获得的结果进行分组:
select customer, max("2012") "2012", max("2013") "2013" -- so on so on for every year
from (
--your existing query
) details
group by customer
选项 2
或者,只需在原始查询中执行最大和分组:
select customer,
max(case when Year(TERM_EFFECTIVE_DATE) = 2012 then TERM_EFFECTIVE_DATE end) as "2012",
max(case when Year(TERM_EFFECTIVE_DATE) = 2013 then TERM_EFFECTIVE_DATE end) "2013" -- so on so on for every year
from
...
group by customer