2017-02-19 26 views
3

我有這樣的一個表:移調行到SQL列,而無需使用聚合功能,如MAX,AVG等

CREATE TABLE MyDataTable 
(
    [RollNo] varchar(8), 
    [QuesBlock] int, 
    [RespVal] varchar(2) 
); 

INSERT INTO MyDataTable ([RollNo], [QuesBlock], [RespVal]) 
VALUES ('MBA0001', 1, A), ('MBA0001', 2, B), ('MBA0001', 3, D), 
     ('MBA0002', 1, C), ('MBA0002', 2, A), ('MBA0002', 3, B), 
     ('MBA0003', 1, B), ('MBA0003', 2, C), ('MBA0003', 3, A); 

因此,我的源數據是這樣的:

Source Data

現在我想達到這樣的目標表結構:

enter image description here

這基本上是爲基於OMR的學校測試中的每個問題列出候選人明智的問題答案。我在QuesBlock列中有固定數量的唯一值(只有),所以我可以使用硬編碼。 我已經通過examples其中pivot已被用來實現這樣的事情,但他們都使用像MAX,MIN,AVG等集合函數處理數值。但在我的情況下,RESPVAL列的值都是文本的。我如何實現這一目標?

回答

2

您可以使用帶字符/字符串的max()。一個簡單的老式pivot將這項工作:

select 
    RollNo 
    , Q1 = max(case when QuesBlock = 1 then RespVal else null end) 
    , Q2 = max(case when QuesBlock = 2 then RespVal else null end) 
    , Q3 = max(case when QuesBlock = 3 then RespVal else null end) 
from MyDataTable 
group by RollNo; 

pivot()像這樣:

select 
    RollNo 
    , Q1 
    , Q2 
    , Q3 
from (select RollNo, QuesBlock='Q'+convert(varchar(2),QuesBlock), RespVal 
     from MyDataTable) as i 
pivot (max(RespVal) for QuesBlock in (Q1,Q2,Q3)) as p; 

或動態pivot()像這樣:

declare @query nvarchar(max); 
declare @cols nvarchar(max); 

select @cols = stuff((select ','+quotename('Q'+convert(varchar(2),QuesBlock)) 
     from MyDataTable as C 
     group by c.QuesBlock 
     order by c.QuesBlock 
     for xml path('')), 1, 1, ''); 
set @query = 'select RollNo, '[email protected]+' 
     from(select RollNo, QuesBlock=''Q''+convert(varchar(2),QuesBlock), RespVal 
     from MyDataTable) as i 
     pivot 
     (
     max(RespVal) 
     for QuesBlock in ('[email protected]+') 
    ) p'; 
exec sp_executesql @query; 

測試設置:http://rextester.com/TURW69000

全部三回:

+---------+----+----+----+ 
| RollNo | Q1 | Q2 | Q3 | 
+---------+----+----+----+ 
| mba0001 | A | B | D | 
| mba0002 | C | A | B | 
| mba0003 | B | C | A | 
+---------+----+----+----+ 
+0

謝謝@SqlZim的深刻反應。幫了很多! – ducktorcoder

+1

@ducktorcoder樂於幫助! – SqlZim