2011-10-06 107 views
3

我有一个查询(选择[型]中,a,B,C,d,从MyTable的E),返回:简单数据枢轴

[type], [a], [b], [c], [d], [e] 
type 1, x , x , x , x , x 
type 2, x , x , x , x , x 
type 3, x , x , x , x , x 

我想以枢转所述数据,以便它作为显示:

[]  , [type 1], [type 2], [type 3] 
[a] , x  , x  , x 
[b] , x  , x  , x 
[c] , x  , x  , x 
[d] , x  , x  , x 
[e] , x  , x  , x 

SQL的任何指针在这里将不胜感激。

+0

类型是否修复? –

+0

列a,b,c,d,e是固定的,但可能有X行(类型) – Mattl

+0

我只需要旋转表,数据不需要分组,即[type]列中的类型将永远是独一无二的。 – Mattl

回答

1

我们需要的是:

SELECT Col, [type 1], [type 2], [type 3] 
FROM (SELECT [type], Amount, Col 
     FROM (SELECT [type], [a], [b], [c], [d], [e] 
       FROM _MyTable) as sq_source 
       UNPIVOT (Amount FOR Col IN ([a], [b], [c], [d], [e])) as sq_up) as sq 
PIVOT (MIN(Amount) FOR [type] IN ([type 1], [type 2], [type 3])) as p; 

但由于类型数量是不确定的,我们必须这样做动态

DECLARE @cols NVARCHAR(2000) 
SELECT @cols = COALESCE(@cols + ',[' + [type] + ']', 
         '[' + [type] + ']') 
FROM _MyTable 
ORDER BY [type] 

DECLARE @query NVARCHAR(4000) 
SET @query = N'SELECT Col, ' + @cols + ' 
FROM (SELECT [type], Amount, Col 
     FROM (SELECT [type], [a], [b], [c], [d], [e] 
       FROM _MyTable) as sq_source 
       UNPIVOT (Amount FOR Col IN ([a], [b], [c], [d], [e])) as sq_up) as sq 
PIVOT (MIN(Amount) FOR [type] IN (' + @cols + ')) as p;'; 

EXECUTE(@query) 

但要小心,因为查询技术上来说是一种注射媒介。

+0

值得注意的是,即使您将@cols和@query更改为nvarchar(max),对于超过4096个“类型”的任何内容也会中断。看到这里:http://msdn.microsoft.com/en-us/library/ms143432.aspx –

+0

谢谢,这正是我现在想要的。我将在稍后处理注射问题! – Mattl

1

这样的事情?

create table #test 
(
type varchar(10), 
a varchar(10), 
b varchar(10), 
c varchar(10), 
d varchar(10), 
e varchar(10) 
) 

insert into #test values 
('type 1', 'x' , 'x' , 'x' , 'x' , 'x'), 
('type 2', 'x' , 'x' , 'x' , 'x' , 'x'), 
('type 3', 'x' , 'x' , 'x' , 'x' , 'x') 

select * from 
(

    select * from 
    (
     select * from #test 
    )data_to_unpivot 
    UNPIVOT 
    (
    Orders FOR [xxx] IN (a,b,c,d,e) 

    )UNPIVOTED_DATA 
)data_to_pivot 
PIVOT 
(
MAX(orders) for type in ([type 1],[type 2],[type 3]) 
)PIVOTED_DATA 
+0

这个硬编码类型(类型1,类型2,类型3)。我之前评论说,类型是可变的。 – Mattl