2

我有如下表:重构T-SQL嵌套SELECT查询到在一个case语句使用

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

我需要的形式接收结果是:制造商,PC。如果一个特定的制造商具有给定类型的模型,我需要将单词“是”与括号中的模型数量连接起来。防爆。是(1)制造商'A'。那么,我该如何避免以下重复?

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

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

+1

这并不完全清楚你想要完成什么 – msmucker0527

+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查询以符合您的要求。

+0

虽然CTE查询只能通过立即声明使用,但链接CTE将允许下一条语句使用来自链中所有CTE的数据。这是一个很棒的功能。谢谢你的例子... –