2016-11-30 145 views
1

对不起,如果标题太可怕了。有一个表T.与列名称,货号,那要么包含我的状态,O,或S.SQL - 查询单独列并根据列数据创建新列

例:

Name Num Status 
Bob 1  I 
Bob 2  O 
Bob 3  O 
John 4  I 
John 5  S 
Joe 6  O 

想要的结果看起来像:

Name Num I O S 
Bob 1 x 
Bob 2  x 
Bob 3  X 
John 4 X 
John 5   X 

谢谢!

编辑:后续问题。

Name Num I O S 
Bob  1 x 
Bob  1  x 
Bob  2  X 

需要的结果是:

Name Num I O S 
Bob  1 X X 
Bob  2  X 

编辑2:实际查询:

SELECT Name, Card_Nmbr, 

[Out] = case when d.Status='I' then 'X' else '' end, 
[In] = case when d.Status='O' then 'X' else '' end, 
[Sales] = case when d.Status='S' then 'X' else '' end 
FROM [PCOdb].[dbo].[GC_Header] as h 
INNER JOIN GC_Detail as d on h.GC_TransNmbr = d.GC_TransNmbr 
INNER JOIN GC_Master as m on d.GCM_Nmbr = m.GCM_Nmbr 
INNER JOIN Galaxy1.dbo.GxUsers as u on h.UserID = u.UserID 
WHERE GC_TransDate between '11/29/16' and dateadd(day,1, '11/29/16') 
Group BY Card_Nmbr, Name 
+0

编辑2:实际查询; – escapeclaws

回答

2

一个简单的例子声明,就可以在这里

Select Name 
     ,Num 
     ,[I] = case when [Status]='I' then 'X' else '' end 
     ,[O] = case when [Status]='O' then 'X' else '' end 
     ,[S] = case when [Status]='S' then 'X' else '' end 
From YourTable 

EDIT to handle multiple rows

Select Name 
     ,Num 
     ,[I] = max(case when [Status]='I' then 'X' else '' end) 
     ,[O] = max(case when [Status]='O' then 'X' else '' end) 
     ,[S] = max(case when [Status]='S' then 'X' else '' end) 
From YourTable 
Group By Name,Num 

Edit 2 - Full Query (Assuming the Joins are doing what you need)

SELECT Name 
     ,Card_Nmbr 
     ,[Out] = max(case when d.[Status]='I' then 'X' else '' end) 
     ,[In] = max(case when d.[Status]='O' then 'X' else '' end) 
     ,[Sales] = max(case when d.[Status]='S' then 'X' else '' end) 
FROM [PCOdb].[dbo].[GC_Header] as h 
JOIN GC_Detail as d on h.GC_TransNmbr = d.GC_TransNmbr 
JOIN GC_Master as m on d.GCM_Nmbr = m.GCM_Nmbr 
JOIN Galaxy1.dbo.GxUsers as u on h.UserID = u.UserID 
WHERE GC_TransDate between '2016-11-29' and DateAdd(DD,1,'2016-11-29') 
Group BY Card_Nmbr, Name 
+0

谢谢!我有一个快速跟进;现在可以说Bob有两个项目,Num = 2,其中一个状态为O,一个状态为I.如果我需要显示一列然后像这样:Bob 2 XX(其中有两个X,在I和O之下专栏)再次感谢! – escapeclaws

+0

@escapeclaws就这样,我清楚,你想让鲍勃有一个与O和我选择的行? –

+0

是的,我在上面添加了一个用于说明的编辑。再次谢谢你! – escapeclaws

1

使用Case表达。

演示:

Create table #temp 
     (Name varchar (10), 
     Num int , 
     [Status] char(1)) 

insert into #temp values ('Bob' , '1' , 'I') 
insert into #temp values ('Bob' , '2' , 'O') 
insert into #temp values ('Bob' , '3' , 'O') 
insert into #temp values ('John' , '4' , 'I') 
insert into #temp values ('John' , '5' ,'S') 
insert into #temp values ('Joe' , '6' , 'O') 



select Name, 
     Num, 
     [I] = case 
       when [Status] ='I' 
       then 'X' 
       else '' 
       end 
     ,[O] = case 
       when [Status] ='O' 
       then 'X' 
       else '' 
       end 
     ,[S] = case when [Status] ='S' 
       then 'X' 
       else '' 
       end 
from #temp 

drop table #temp 

结果:

enter image description here

0

对于SQL Server 2012和更高版本可以使用IIF (Transact-SQL)功能了。

Select Name 
     ,Num 
     ,IIF([Status] = 'I' , 'X', '') AS [I] 
     ,IIF([Status] = 'O' , 'X', '') AS [O] 
     ,IIF([Status] = 'S' , 'X', '') AS [S] 
FROM TableName