2015-12-18 4 views
5

私はテーブルにいくつかのデータをPIVOTしようとしていますが、私はvarcharの列を使用してそれを行う方法を見つけることができないので、私はそれを行うことはできません。私はこのテーブルを持っている:ピボット列のvarchar

declare @table table(name VARCHAR(50) not null, occupation VARCHAR(MAX)) 

insert into @table values ('A','Doctor') 
insert into @table values ('B','Doctor') 
insert into @table values ('A','Professor') 
insert into @table values ('A','Singer') 
insert into @table values ('A','Actor') 

SELECT 

CASE WHEN occupation = 'Doctor' THEN NAME END AS Doctor, 
CASE WHEN occupation = 'Professor' THEN NAME END AS Professor, 
CASE WHEN occupation = 'Singer' THEN NAME END AS Singer, 
CASE WHEN occupation = 'Actor' THEN NAME END AS Actor 
FROM @table 

は出力:

Doctor Professor Singer Actor 
A NULL NULL NULL 
B NULL NULL NULL 
NULL A NULL NULL 
NULL NULL A NULL 
NULL NULL NULL A 

とピボットのための私は、この出力を得る:

select * from 
(
select name, occupation from @table) src 
pivot (
min(name) 
for occupation in ([Doctor],[Professor],[Singer],[Actor])) as pvt 

Doctor Professor Singer Actor 
A  A   A  A 

そして、最小/最大のために/ピボット機能を機能は、私は部分的にしか提供します出力、カウント関数のために私は医者、歌手などのレコードの数を取得します。しかし、私は実際の行ではなく、行数が必要です。私は必要なもの

はこれです:私たちは、医師の列の5つの項目を表示する必要が医師のための5名を持っている場合

Doctor Professor Singer Actor 
A  A   A  A 
B  NULL  NULL NULL 

すなわちは考えます。

私は、これは簡単に( `ROW_NUMBERを使用して生成される連続番号を使用するなど、条件付き集約を表現するために見つける

答えて

2

):

select max(case when occupation = 'Doctor' then name end) as Doctor, 
     max(case when occupation = 'Professor' then name end) as Professor, 
     max(case when occupation = 'Singer' then name end) as Singer, 
     max(case when occupation = 'Actor' then name end) as Actor  
from (select t.*, 
      row_number() over (partition by occupation order by name) as seqnum 
     from @table t 
    ) t 
group by seqnum 
order by seqnum; 
+0

ありがとう:

╔════════╦═══════════╦════════╦═══════╗ ║ Doctor ║ Professor ║ Singer ║ Actor ║ ╠════════╬═══════════╬════════╬═══════╣ ║ A ║ A ║ A ║ A ║ ║ B ║ ║ ║ ║ ║ ║ ║ C ║ ║ ╚════════╩═══════════╩════════╩═══════╝ 

あなたは第二ケースを使用したい場合は! :)。 しかし、Order byは他のレコードの昇順ではありません。実際にはすべての列を昇順で並べ替える必要がありますので、1,2,3,4 – MAX

+0

@maxで注文しました。 。 。名前を昇順にするには、 'order by'節で' row_number() 'に' order by name'を使います。 –

+0

私はrow_number()でそれを行うことができると感じました。実際、私はサブクエリも別に書いています。しかし、私は外側と実際の列のcase文の両方を内部クエリのROWIDとマージすることを知らなかった。 – MAX

1

あなたが提案したようにあなただけのROW_NUMBERでカラムを追加し、PIVOTを使用することができます。

SELECT [Doctor],[Professor],[Singer],[Actor] 
FROM (SELECT name, occupation, 
      rn = ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY occupation) 
     FROM @table) AS src 
PIVOT (
    MIN(name) 
    FOR occupation IN ([Doctor],[Professor],[Singer],[Actor]) 
) AS pvt 

LiveDemo

出力:

╔════════╦═══════════╦════════╦═══════╗ 
║ Doctor ║ Professor ║ Singer ║ Actor ║ 
╠════════╬═══════════╬════════╬═══════╣ 
║ A  ║ A   ║ A  ║ A  ║ 
║ B  ║   ║  ║  ║ 
╚════════╩═══════════╩════════╩═══════╝ 

EDIT:

あなたはより多くの行を処理する方法を書くので、この場合を考慮していませんでした。 上記の溶液を返します。

╔════════╦═══════════╦════════╦═══════╗ 
║ Doctor ║ Professor ║ Singer ║ Actor ║ 
╠════════╬═══════════╬════════╬═══════╣ 
║ A  ║ A   ║ A  ║ A  ║ 
║ B  ║   ║ C  ║  ║ 
╚════════╩═══════════╩════════╩═══════╝ 

対:

SELECT [Doctor],[Professor],[Singer],[Actor] 
FROM (SELECT name, occupation, 
      rn = DENSE_RANK() OVER (ORDER BY Name) 
     FROM @table) AS src 
PIVOT (
    MIN(name) 
    FOR occupation IN ([Doctor],[Professor],[Singer],[Actor]) 
) AS pvt 

LiveDemo2

+1

こんにちは@ lad2025、良い投稿。実際に私はすべての列を昇順で注文する必要があります – MAX

+0

@max更新された – lad2025

+0

を参照してくださいありがとう@ lad2025私は外部のクエリで注文しようとしています – MAX