手動でピボットするためのストアド プロシージャがあります
ALTER procedure [dbo].[performancepivot] (
@startdate datetime,
@enddate datetime
) as begin
set nocount on
declare @date1 nvarchar(100)=convert(varchar, @startdate+'00:00:00.000',120),
@date2 nvarchar(100)= convert(varchar, @enddate+'23:59:59.000',120);
with cte as
dbo.testfunctionstacknew(convert(decimal(10,1),avg(convert(numeric(18,2), datediff(ss, t.Paydate, t.DelDate))))) as Average
from Transaction_tbl as t
left join VType_tbl as v on t.vtid = v.vtid
left join Location_tbl as l on t.Locid = l.Locid
where t.Locid in (select t1.Locid from Transaction_tbl as t1)
and t.dtime between @date1 and @date2
and t.Status = 5
group by v.Vtype, l.LocName, l.Locid)
select c.LocName,
max(case when c.Vtype = 'Normal' then Average end) as Normal,
max(case when c.Vtype = 'Vip' then Average end) as Vip,
max(case when c.Vtype = 'VVip' then Average end) as VVip,
max(case when c.Vtype = 'Pass' then Average end) as Pass,
max(case when c.Vtype = 'Staff' then Average end) as Staff
from cte as c group by c.LocName order by c.LocName
end
これを実行している間、私は正確な出力を得ています..私は手動でピボットしたくありません..だから私はストアドプロシージャ「動的にピボット」を書き込もうとしています..私はこのようなストアドプロシージャを書き込もうとしています:
ALTER procedure [dbo].[ParkingSummary1]
@startdate nvarchar(100), @enddate nvarchar(100) as
begin
declare @date1 nvarchar(100) = convert(varchar, @startdate+' 00:00:00.000', 120)
declare @date2 nvarchar(100) = convert(varchar, @enddate+' 23:59:59.000', 120)
DECLARE @cols AS NVARCHAR(MAX),@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Vtype) from VType_tbl
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')
set @query = 'SELECT LocName, ' + @cols + '(
select l.LocName,v.Vtype,[dbo].[testfunctionstacknew](
CONVERT(decimal(10,1), AVG( CONVERT(NUMERIC(18,2),
DATEDIFF(SS,t.Paydate,t.DelDate) ) ))) as Average
from (select l.LocName,Vtype from Transaction_tbl t join
VType_tbl v on t.vtid = v.vtid join dbo.Location_tbl l on
t.locid=l.Locid where dtime between '''+ @date1 +''' and '''+ @date2 +'''
and Status = 5) d pivot ( count(Vtype) for Vtype in (' + @cols + ')) p '
print @query
exec sp_executesql @query;
end
しかし、このストアド プロシージャの実行中にエラーが発生します。列 'Location_tbl.LocName' は、集計関数または GROUP BY 句に含まれていないため、選択リストでは無効です。私の2番目のストアドプロシージャの何が問題になっていますか..誰かが知っているなら、私が見つけ出すのを手伝ってください