2016-06-13 45 views
1

我有一个表列测试,它具有列标签。它的数据长度超过50个字符。在创建数据透视表时将列名转换为特定字符-SQL

当我从'test'表创建数据透视表时,它使用那些长字符数据作为列名。

我的要求是用户强制转换函数将列名限制为26个字符。

我使用下面的脚本,但它不能按需要工作。

create table V_Test as 
select * from 
    (select * from Test) x 
pivot (sum(Average) for Label in (
    S03_CreatePlansdadsada, 
    S03_CreatePlan_T01_NavigateTosdsadsaded, 
    S03_CreatePlan_T03_abcdefgmanagementsdasda, 
    S03_CreatePlan_T16_SetStatusToOngoingasdasda, 
    S03_CreatePlan_T17_Ldsdssdadsadas       
) 
) p 

在此先感谢您的帮助

+2

这是SQLServer的?请用数据库引擎标记。 – trincot

+0

[使用PIVOT SQL Server 2008时更改列名称]的可能的重复(http://stackoverflow.com/questions/8122862/change-column-name-while-using-pivot-sql-server-2008) – trincot

+0

我能通过修改前面两行来创建表格:select * into V_Test from ..但是,在修剪列名称时没有运气。任何帮助表示感谢.. –

回答

1

由于标签名称是硬编码的,无论如何,然后使用他们的别名应该罚款。

在MS SQL Server上它看起来像这样。
只是为演示目的使用变量表和临时表。

DECLARE @Test TABLE (PlanID int, Label varchar(50), Average int); 
insert into @Test values 
(1,'S03_CreatePlansdadsada',10), 
(1,'S03_CreatePlan_T01_NavigateTosdsadsaded',20), 
(1,'S03_CreatePlan_T03_abcdefgmanagementsdasda',30), 
(1,'S03_CreatePlan_T16_SetStatusToOngoingasdasda',40), 
(1,'S03_CreatePlan_T17_Ldsdssdadsadas',50), 
(1,'S03_CreatePlansdadsada',60), 
(1,'S03_CreatePlan_T01_NavigateTosdsadsaded',70), 
(1,'S03_CreatePlan_T03_abcdefgmanagementsdasda',80), 
(1,'S03_CreatePlan_T16_SetStatusToOngoingasdasda',90), 
(1,'S03_CreatePlan_T17_Ldsdssdadsadas',100); 

IF OBJECT_ID('tempdb..#tmpTest') IS NOT NULL DROP TABLE #tmpTest; 

select 
PlanID, 
S03_CreatePlansdadsada as CreatePlans, 
S03_CreatePlan_T01_NavigateTosdsadsaded as T01_NavigateTo, 
S03_CreatePlan_T03_abcdefgmanagementsdasda as T03_managements, 
S03_CreatePlan_T16_SetStatusToOngoingasdasda as T16_SetStatusToOng, 
S03_CreatePlan_T17_Ldsdssdadsadas as T17_Lsd 
into #tmpTest 
from @Test 
pivot (sum(Average) for Label in (
    S03_CreatePlansdadsada, 
    S03_CreatePlan_T01_NavigateTosdsadsaded, 
    S03_CreatePlan_T03_abcdefgmanagementsdasda, 
    S03_CreatePlan_T16_SetStatusToOngoingasdasda, 
    S03_CreatePlan_T17_Ldsdssdadsadas       
    ) 
) p; 

select * from #tmpTest; 

这将返回以下结果:

PlanID CreatePlans T01_NavigateTo T03_managements T16_SetStatusToOng T17_Lsd 
1   70   90   110    130     150 

动态的方式是有点复杂,因为SQL需要构建,因此它可以被执行。 (注意代码注入的)

IF OBJECT_ID('tempdb..#tmpTestData') IS NOT NULL DROP TABLE #tmpTestData; 
CREATE TABLE #tmpTestData (PlanID int, Label varchar(50), Average int); 

insert into #tmpTestData values 
(1,'S03_CreatePlansdadsada',10), 
(1,'S03_CreatePlan_T01_NavigateTosdsadsaded',20), 
(1,'S03_CreatePlan_T03_abcdefgmanagementsdasda',30), 
(1,'S03_CreatePlan_T16_SetStatusToOngoingasdasda',40), 
(1,'S03_CreatePlan_T17_Ldsdssdadsadas',50), 
(1,'S03_CreatePlansdadsada',60), 
(1,'S03_CreatePlan_T01_NavigateTosdsadsaded',70), 
(1,'S03_CreatePlan_T03_abcdefgmanagementsdasda',80), 
(1,'S03_CreatePlan_T16_SetStatusToOngoingasdasda',90), 
(1,'S03_CreatePlan_T17_Ldsdssdadsadas',100); 

declare @Columns nvarchar(max); 
declare @AliasedColumns nvarchar(max); 
set @Columns = STUFF((SELECT ', ' + QUOTENAME(Label) FROM #tmpTestData GROUP BY Label FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(max)') ,1,1,''); 
set @AliasedColumns = STUFF((SELECT ', ' + QUOTENAME(Label) +' as '+ QUOTENAME(substring(Label,5,14)) FROM #tmpTestData GROUP BY Label FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(max)') ,1,1,''); 

declare @SQL nvarchar(max); 

IF OBJECT_ID('tempdb..##tmpPivotTest') IS NOT NULL DROP TABLE ##tmpPivotTest; 
set @SQL = 'select PlanID, '+ @AliasedColumns + ' 
into ##tmpPivotTest 
from #tmpTestData pivot (sum(Average) for Label in ('+ @Columns +')) p'; 

--select @SQL; 
exec (@SQL); 

select * from ##tmpPivotTest; 
IF OBJECT_ID('tempdb..##tmpPivotTest') IS NOT NULL DROP TABLE ##tmpPivotTest; 

对于Oracle数据库,将是这个样子:

CREATE TABLE V_Test AS 
SELECT * FROM (select Label, Average from Test) 
PIVOT (
    SUM(Average) AS sum_average FOR (Label) IN (
    'S03_CreatePlansdadsada' as CreatePlans, 
    'S03_CreatePlan_T01_NavigateTosdsadsaded' as T01_NavigateTo, 
    'S03_CreatePlan_T03_abcdefgmanagementsdasda' as T03_Managements, 
    'S03_CreatePlan_T16_SetStatusToOngoingasdasda' as T16_SetStatusToOng, 
    'S03_CreatePlan_T17_Ldsdssdadsadas' as T17_Lsd     
    ) 
) p; 
+0

谢谢,但这不适合我。我在'as'中收到错误。对不起,我没有提到清楚。这是SQL服务器 –

+0

我能够通过修改前面两行来创建表格:select * into V_Test from ..但是,在修剪列名称时没有运气。任何帮助表示赞赏。 –

+0

我添加的sql-server版本适合你吗?它不必是仅在会话期间存在的临时表。 – LukStorms