在列中查找第一个搜索值并检索列中的详细信息

时间:2010-09-21 11:03:22

标签: sql sql-server sql-server-2005 tsql

我想知道是否可以确定从哪一列中提取合并值?

我有以下示例数据(实际年份范围从1989年到2010年的数据,为简洁而未显示)

ID    |   2000  | 2000 value | 2001  |2001 value |  2002  |2002 value | 2003  |2003 value |  2004  | 2004 value | 2005 | 2005 value
id001 |  single | 15.46      |regular|50         | NULL   | 0         |single | 152       | regular|15.20       |single| 15.99
id002 | regular | 20.46      |regular|17.99      |single  | 150.23    |both   |  256.3    | NULL   |  0         | NULL |  0

其中single / regular / both反映了该ID在该年份为某些事物支付的费用(而NULL表示没有购买)。

我理想的情况是,2005年至2010年期间每年会有三列,告诉您当年之前的最新单笔付款类型(以及它在哪一年下降),以及常规和两种付款方式

因此,对于上面的示例,结果将如下所示:

ID    |   2005 prior single year  |  2005 prior regular year  |  2005 prior both year
id001 |   2003                    |  2004                     | NULL
id002 |   2002                    |  2001                     | 2003

我也希望能够提取各自的价值(2005-2010所有年份)。

从根本上说,它只是查看列以查找第一个实例的情况,但除了某种合并之外,我不确定如何最好地接近它!

谢谢! :)

2 个答案:

答案 0 :(得分:1)

首先,我写一个视图来规范化数据:

select  2000 as year
,       [2000 value] as value
,       [2000 type] as type
from    YourTable
where   year = 2000
union all
select  2001
,       [2001 value]
,       [2001 type]
from    YourTable
where   year = 2001
....

然后你可以查看2005年之前的第一年:

select  a.year [prior to 2005]
,       a.value
,       a.id
from    YourView a
where   year = 
        (
        select  max(year) 
        from    YourView b 
        where   a.id = b.id 
                and a.type = b.type 
                and b.year < 2005
        )

获得规范化数据后,您可以在此主题上创建许多变体。

答案 1 :(得分:1)

从现有表格中,尝试:

select ID,
       case 'single'
           when [2004] then '2004'
           when [2003] then '2003'
           when [2002] then '2002'
           when [2001] then '2001'
           when [2000] then '2000'
           else NULL
       end [2005 prior single year],
       case 'regular'
           when [2004] then '2004'
           when [2003] then '2003'
           when [2002] then '2002'
           when [2001] then '2001'
           when [2000] then '2000'
           else NULL
       end [2005 prior regular year],
       case 'both'
           when [2004] then '2004'
           when [2003] then '2003'
           when [2002] then '2002'
           when [2001] then '2001'
           when [2000] then '2000'
           else NULL
       end [2005 prior both year]
from YourTable YT