日期:2014-05-18  浏览次数:20374 次

有一张科目表有如下,但是没有明显的字段标明那一个是末级科目,请问如何查找出末级科目


有一张科目表有如下,但是没有明显的字段标明那一个是末级科目,请问如何查找出末级科目
代码                         项目名称            
20310 项目1                      
2031001 项目1.1                
2031002 项目1.2                
203100201 项目1.2.1            
203100202 项目1.2.2            
2031003 项目1.3                  
2031004 项目1.4            

找出来应该是这样

代码                         项目名称           是否末级
20310 项目1                     否  
2031001 项目1.1                 是
2031002 项目1.2                 否
203100201 项目1.2.1             是
203100202 项目1.2.2             是
2031003 项目1.3                 是
2031004 项目1.4                 是


------解决方案--------------------
--try:

select 代码,项目名称,
是否末级=case when (select count(*) from 科目表 where 代码 like rtrim(A.代码)+ '% ')> 1
then '否 '
else '是 '
end
from 科目表 A
------解决方案--------------------
有點問題,修改下

Select Distinct A.*, (Case When B.代码 Is Null Then '是 ' Else '否 ' End) As 是否末级
From 科目表 A
Left Join 科目表 B
On B.代码 Like A.代码 + '% ' And A.代码 != B.代码
------解决方案--------------------
--建立测试环境
create table #tb(代码 varchar(10),项目名称 varchar(10))
insert #tb(代码,项目名称)
select '20310 ', '项目1 ' union all
select '2031001 ', '项目1.1 ' union all
select '2031002 ', '项目1.2 ' union all
select '203100201 ', '项目1.2.1 ' union all
select '203100202 ', '项目1.2.2 ' union all
select '2031003 ', '项目1.3 ' union all
select '2031004 ', '项目1.4 '
go
--执行测试语句
select t.代码,t.项目名称,isnull(max(case when t2.代码 is null then '是 ' end), '否 ')
from #tb t
left join #tb t2 on charindex(t.代码,t2.代码) > 0 and t.代码 <> t2.代码
group by t.代码,t.项目名称
go
--删除测试环境
drop table #tb
go
/*--测试结果
代码 项目名称
---------- ---------- ----
20310 项目1 否
2031001 项目1.1 是
2031002 项目1.2 否
203100201 项目1.2.1 是
203100202 项目1.2.2 是
2031003 项目1.3 是
2031004 项目1.4 是

(7 row(s) affected)

*/

------解决方案--------------------
--創建測試環境
Create Table 科目表
(代码 Varchar(50),
项目名称 Nvarchar(50))
Insert 科目表 Select '20310 ', N '项目1 '
Union All Select '2031001 ', N '项目1.1 '
Union All Select '2031002 ', N '项目1.2 '
Union All Select '203100201 ', N '项目1.2.1 '