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的數據。這是一個很棒的功能。謝謝你的例子... –