Sql 跨列查找第一个搜索值并检索在其中找到的列详细信息
我想知道是否可以确定从哪个列中提取合并值 我有以下示例数据,数据中的实际年份范围为1989-2010年,为简洁起见未显示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
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是一个更好的方法——这是一个快速而肮脏的一次性解决方案。