2017-10-17 35 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列。

相关问题