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

Sql 跨列查找第一个搜索值并检索在其中找到的列详细信息,sql,sql-server,sql-server-2005,tsql,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

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

我有以下示例数据,数据中的实际年份范围为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/两者都反映了该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年所有年份的相应值

从根本上说,这只是一个跨列查找第一个实例的案例,但除了某种合并之外,我不确定如何最好地实现这一点


谢谢

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

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
        )

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

从现有表中,尝试:

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

所以我不喜欢没有规范化的数据结构。使编写查询等同于地狱。也许将数据转换为符合第三种标准格式的数据结构是有意义的?问题是,我不仅要查找最近一年,而且要查找同一类型的最近一年,因此where子句还需要包括where 2005=single,where子句的结果也等于single,这是我正在努力解决的主要问题!Thanks@Davin:您可以在where子句中检查类型和id是否相等?答案编辑感谢这一点,但不幸的是,由于我的年份范围从1989年到2010年,拥有这一案例陈述并不是非常实际,因为它在以后几年会变得相当大@大卫:复制粘贴,我的朋友!说真的,这就是为什么从长远来看,normalistion是一个更好的方法——这是一个快速而肮脏的一次性解决方案。