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