2016-11-30 2 views
1

Извините, если заголовок ужасен. У таблицы T. колонкой Имя, Num и состояния, которые либо содержит I, O или S.SQL - запрос для разделения отдельного столбца и создания новых столбцов на основе данных столбца

Ex:

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 

EDIT 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

EDIT 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

Спасибо! У меня быстрое наблюдение; теперь можно сказать, что у Боба есть два элемента с Num = 2, один с статусом O, один со статусом I. Что делать, если мне нужно показать один столбец тогда так: Bob 2 XX (где есть два X, под I и O столбцы) Еще раз спасибо! – escapeclaws

+0

@escapeclaws Просто так я понимаю, вы хотите, чтобы у Боба была 1 строка с 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