2016-11-30 18 views
1

タイトルが恐ろしい場合は、申し訳ありません。 O、列名、テンキー、およびいずれかのIが含まれているステータスを持つテーブルTを持っている、またはS.SQL - 単一の列を分離し、列データに基づいて新しい列を作成するクエリ。

例:

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

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  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

シンプルcase文はここ

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

役立つだろうし

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の2つのアイテム、ステータスOのステータス、ステータス1のステータスを持つ2つのアイテムを持っていると言うことができます。Bob 2 XX(IとOの下に2つのXがある列)おかげさまでもう一度! – escapeclaws

+0

@escapeclawsちょうど私ははっきりしています。あなたはボブにOと1行を選んでもらいたいですか? –

+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 
関連する問題