重构要在case语句中使用的T-SQL嵌套SELECT查询

时间:2012-10-18 12:33:39

标签: sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2

我有下表:

maker   model   type
B   1121    pc
A   1233    pc
E   1260    pc
A   1752    laptop
A   1276    printer
D   1288    printer

我需要收到以下形式的结果:maker,pc。如果某个特定的制造商拥有给定类型的模型,我需要将“是”这个词与括号中的模型数量连接起来。防爆。制造商'A'是(1)。那么,我怎样才能避免以下重复?

CASE 
WHEN SELECT COUNT(*) WHERE ... > 0
THEN 'yes(' + CAST((SELECT COUNT(*) WHERE ...) AS varchar) + ')'

这不是一个现实世界的问题。我只需要了解如何保存子查询结果以在分支语句中使用它。此分支语句的结果可能包含子查询结果本身。

1 个答案:

答案 0 :(得分:3)

创建表格:

create table #t (maker varchar(100), model  varchar(100), type varchar(100) );
insert into #t ( maker,   model,   type )  values 
( 'B',   '1121',    'pc'),
( 'A',   '1233',    'pc'),
( 'E',   '1260',    'pc');

以简单的步骤查询:

;with 
totals as (
   select maker, type,
       count( * ) as n
   from
       #t
   group by 
      maker,  type
      ) ,
maker_type as (
   select distinct maker, type
   from #t
)
select 
   mm.*, t.n, 
   case  when t.n is null then 'No' else 'Yes' end as yes_no
from
   maker_type mm
left outer join
   totals t
      on mm.maker = t.maker and
         mm.type = t.type

Results

maker type n yes_no 
----- ---- - ------ 
A     pc   1 Yes    
B     pc   1 Yes    
E     pc   1 Yes 

我没有扩展解决方案连接字符串,因为我发现你知道如何做到这一点。可以随意更改第一个或第二个CTE查询以符合您的要求。