1

SSRSレポートのグリッドを埋めるために、動的テーブルを作成し、偽の列と偽の行の両方を作成するクエリがあります。

Declare @FieldLogID as int
Set @FieldLogID = 1018;

With EmployeeActivity as
(
SELECT distinct *, row_number() over(order by Employee_EmployeeID)as row
 from
    (

Select Employee_EmployeeID,
Employee_FullName,
Injured_Today_Custom,
--Case when JobAccount_TrackingID like'zzz%' then Null else JobAccount_TrackingID end as 
JobAccount_TrackingID,
StartDateTime, 
StopDateTime, 
WorkHours
from 
(
Select row_number() over (partition by Employee_EmployeeID order by JobAccount_TrackingID) row,*
from 
(
SELECT DISTINCT
CustomizedFieldLogEmployee_1.Employee_EmployeeID, 
CustomizedFieldLogEmployee_1.Employee_FullName, 
NULL as Injured_Today_Custom, 
CustomizedFieldLogJobAccount_1.JobAccount_TrackingID, 
null as StartDateTime, 
null as StopDateTime, 
null as WorkHours
FROM
CustomizedAccount INNER JOIN CustomizedFieldLogJobAccount AS CustomizedFieldLogJobAccount_1 ON CustomizedAccount.AccountID = CustomizedFieldLogJobAccount_1.Account_AccountID 
RIGHT OUTER JOIN CustomizedFieldLogEmployee AS CustomizedFieldLogEmployee_1 ON CustomizedFieldLogJobAccount_1.FieldLog_FieldLogID = CustomizedFieldLogEmployee_1.FieldLog_FieldLogID
WHERE        
CustomizedFieldLogEmployee_1.FieldLog_FieldLogID = @FieldLogID 
AND 
CustomizedAccount.AppliesToEmployees = 1
Union
(Select 'aaaa01' EmployeeID,NULL,NULL,NULL,NULL,NULL,NULL
        union Select 'aaaa02',NULL,NULL,NULL,NULL,NULL,NULL
        union Select 'aaaa03',NULL,NULL,NULL,NULL,NULL,NULL
        union Select 'aaaa04',NULL,NULL,NULL,NULL,NULL,NULL
        union Select 'aaaa05',NULL,NULL,NULL,NULL,NULL,NULL)
Union
Select Distinct 
Employee_EmployeeID,
Employee_FullName,
null as Injured_Today_Custom,
fake_TrackingID,
null as StartDateTime, 
null as StopDateTime, 
null as WorkHours
FROM
CustomizedFieldLogEmployee
cross join
(
Select 'zzz01' fake_TrackingID
union Select 'zzz02' 
union Select 'zzz03' 
union Select 'zzz04' 
union Select 'zzz05' 
union Select 'zzz06' 
union Select 'zzz07' 
union Select 'zzz08' 
union Select 'zzz09' 
union Select 'zzz10' 
) a where FieldLog_FieldLogID = @FieldLogID
) b 
) c where Row<=9
--order by Employee_EmployeeID,JobAccount_TrackingID
)d
);

Select * from EmployeeActivity

これをテーブルにピボットする必要があります。次の関数を使用して動的ピボットを実行しようとしましたが、実行しようとするとエラーが発生します。

キーワードExecの近くの構文が正しくありません。

コード:

create procedure dynamic_pivot
(
@select varchar(2000),
@PivotCol varchar(100), 
@Summaries varchar(100)
) as
declare @pivot varchar(max), @sql varchar(max)
select @select =replace(@select,'select ','select '+@PivotCol+' as pivot_col,')


create table #pivot_columns (pivot_column varchar(100))

Select @sql='select distinct pivot_col from ('+@select+') as t'

insert into #pivot_columns
exec(@sql)

select @pivot=coalesce(@pivot+',','')+'['+pivot_column+']'from #pivot_columns

select @sql=
'
    select * from 
    (
        '+@select+'
    ) as t 
    pivot 
    (
        '+@Summaries+' for pivot_col in ('+@pivot+')
    ) as p
'

exec(@sql)

エラーの原因となるSQLの実行:

EXEC dynamic_pivot
   'SELECT Employee_EmployeeID, Employee_FullName,StartDateTime from EmployeeActivity',
   'JobAccount_TrackingID',
   'Count(row)'

現在、このデータをピボットするためにこの関数に縛られていませんが、標準のピボットを実行できないことの1つは、実行時まで列を構成する値がわからないことです。

これを行うための最良の方法は何ですか?

4

1 に答える 1

0

動的ピボットは、 (キーワードCOMMON TABLE EXPRESSIONを使用して定義した)ではなく、実際のテーブルで機能しています。WITH簡単な解決策は、CTE から実際のテーブルを作成することです。

上部に追加

if object_id('tempdb..#EmployeeActivity') is not null
drop table #EmployeeActivity;

クエリの最後に、次のinto #EmployeeActivity句を追加します。

Select *
into #EmployeeActivity
from EmployeeActivity;

動的ピボットが機能するはずです。row注:選択リストに入れる必要があると思います。

EXEC dynamic_pivot
'SELECT Employee_EmployeeID, Employee_FullName,StartDateTime,row from EmployeeActivity',
'JobAccount_TrackingID',
'Count(row)'
于 2012-10-12T03:23:31.387 に答える