2017-10-17 36 views
0

新的sql和新的堆棧,所以我很抱歉,如果這是一個重複的問題。我很新,我甚至不知道如何說明問題,或者如果可能的話。如何從一個列中選擇多個字段並將其輸出到單個行

table1 
----------------------------- 
| table2.key | codes | 
----------------------------- 
| 1   | 'pizza' | 
----------------------------- 
| 1   | 'cheese' | 
----------------------------- 
| 2   | 'pizza' | 
----------------------------- 
| 3   | 'zebra' | 

table2 
------------------- 
| key | name | 
------------------- 
| 1 | 'steve' | 
------------------- 
| 2 | 'john' | 
------------------- 
| 3 | 'ralph | 

不知道如何編寫select語句我想要的東西,所以我會告訴你我想爲我的輸出是從上面的表

Desired output 
------------------------------------ 
| key | Name | cPizza | cCheese| 
------------------------------------ 
| 1 |'steve'| 'pizza'|'cheese' | 
------------------------------------ 
| 2 |'john' | 'pizza'| ''  | 
------------------------------------ 
| 3 |'ralph'| '' | '' | 

我的情況更比這複雜。我需要爲每個ID返回一行,但是我寫的每個代碼都會返回多行。

我想返回table2中的所有人,並顯示他們是否有匹薩或奶酪代碼。如果他們不留空白。

+1

你將需要一個表與披薩代碼.... sql將不會知道斑馬,直到你將它引用到代碼表,否則它將是一個大規模案例或iif聲明...和一個左連接應該解決這個問題 – maSTAShuFu

+0

如果要在表1中添加新行{1,「ham」} – SEarle1986

+1

請問您應該怎麼做?另外,爲什麼「zebra」沒有出現在Ralph? – SEarle1986

回答

0

這是一個查詢,它會給你你的結果。這不是很好的擴展性,但不知道實際的用例,這會從你的例子中得到你想要的結果。

創建的測試數據:

DECLARE @table1 TABLE (
    tbl_key INT, 
    codes NVARCHAR(MAX) 
) 

INSERT @table1 VALUES 
(1, 'pizza'), 
(1, 'cheese'), 
(2, 'pizza'), 
(3, 'zebra') 

DECLARE @table2 TABLE (
    tbl_key INT, 
    name NVARCHAR(MAX) 
) 

INSERT @table2 VALUES 
(1, 'steve'), 
(2, 'john'), 
(3, 'ralph') 

查詢:

SELECT 
    tbl2.tbl_key AS [key], 
    tbl2.name AS [Name], 
    ISNULL(pizza_tbl.codes, '') AS cPizza, 
    ISNULL(cheese_tbl.codes, '') AS cCheese 
FROM @table2 tbl2 
LEFT JOIN (
    SELECT 
     tbl_key, 
     codes 
    FROM @table1 tbl1 
    WHERE codes = 'cheese' 
    ) cheese_tbl ON 
    tbl2.tbl_key = cheese_tbl.tbl_key 
LEFT JOIN (
    SELECT 
     tbl_key, 
     codes 
    FROM @table1 tbl1 
    WHERE codes = 'pizza' 
    ) pizza_tbl ON 
    tbl2.tbl_key = pizza_tbl.tbl_key 
0

下面是你需要

DECLARE @table1 TABLE (
    tbl_key INT, 
    codes NVARCHAR(MAX) 
) 

INSERT @table1 VALUES 
(1, 'pizza'), 
(1, 'cheese'), 
(2, 'pizza'), 
(3, 'zebra') 

DECLARE @table2 TABLE (
    tbl_key INT, 
    name NVARCHAR(MAX) 
) 

INSERT @table2 VALUES 
(1, 'steve'), 
(2, 'john'), 
(3, 'ralph') 


select distinct a.tbl_key as [key] ,a.Name ,isnull(ab.codes,'') as cPizza,isnull(ac.codes,'') as cCheese,isnull(ad.codes,'') as cZebra 
from @table2 a 

outer apply (select codes from @table1 where a.tbl_key = tbl_key and codes = 'pizza') as ab 
outer apply (select codes from @table1 where a.tbl_key = tbl_key and codes = 'cheese') as ac 
outer apply (select codes from @table1 where a.tbl_key = tbl_key and codes = 'zebra') as ad 
+1

您能否指出*爲什麼*和*如何解決OP問題?雖然它可能在技術上回答OP的問題,但只是一些粘貼的代碼不是一個好的答案。 –

0

什麼較短的版本。如果你知道的codes提前值您可以使用PIVOT運算符將行轉換爲列。下面的查詢:

select tbl_key,name,[pizza] ,[cheese] 
from (select t2.tbl_key,t2.name,t1.codes 
     from table1 t1 inner join table2 t2 on t1.tbl_key=t2.tbl_key 
    ) as source 
PIVOT 
(
    MAX(codes) 
    FOR codes in ([cheese],[pizza]) 
) as pvt  

將返回

tbl_key name pizza cheese 
1  steve pizza cheese 
2  john pizza NULL 
3  ralph NULL NULL 

您可以更改列的名稱,或者用一個空字符串替換空:

select tbl_key,name,ISNULL([pizza],'') as cPizza ,ISNULL([cheese],'') as cCheese 
from (select t2.tbl_key,t2.name,t1.codes 
     from table1 t1 inner join table2 t2 on t1.tbl_key=t2.tbl_key 
    ) as source 
PIVOT 
(
    MAX(codes) 
    FOR codes in ([cheese],[pizza]) 
) as pvt  

PIVOT運算計算的總每個值都使用值名稱將其公開爲一列。在這種情況下,對於cheesepizza值,它計算出MAX(codes),本質上是該值本身,並將其公開爲cheesepizza列。

相關問題