2016-06-13 4 views
1

私は列ラベルを持つテーブルテストを持っています。それは、長さが50文字よりも長いデータを有する。ピボットテーブル作成時に列名を特定の文字にキャスト -

'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

できました最初の2行を以下のように変更してテーブルを作成します: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は、それを実行できるように構成する必要があるため、動的な方法は、もう少し複雑です。 Oracleデータベースの場合(コードインジェクションの用心)

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; 

それはこのようなものになります。

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

です。最初の2行を以下のように変更してテーブルを作成することができました。select * into V_Test from ..ただし、列名をトリミングすることはできません。どんな助けもありがとうございます。 –

+0

私が追加したSQL Serverのバージョンはあなたに適していますか?セッション中にのみ存在する一時テーブルである必要はありません。 – LukStorms

関連する問題