1

次のようなストアプロシージャがあります。

ALTER procedure [dbo].[performance]  @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)
    set NOCOUNT on;
    select l.LocName,v.Vtype,
           SUM(convert(numeric(18, 2), 
           DATEDIFF(MI,t.DelDate,t.Paydate))) as TotalDiff,
           [dbo].[testfunctionstacknew]
                 (CONVERT(decimal(10,1), 
                          AVG( CONVERT(NUMERIC(18,2),
                                       DATEDIFF(SS,t.Paydate,t.DelDate) ) ))
                 )  as Average
    from Transaction_tbl t 
    left join VType_tbl v on t.vtid=v.vtid 
    left join Location_tbl l on t.Locid=l.Locid 
    where t.Locid in (select t1.Locid  from Transaction_tbl t1) and 
          dtime between @date1 and @date2 and 
          Status =5 
    group by v.Vtype,l.LocName,l.Locid 
    order by l.Locid
end

私はこのように出ています:

LocName   Vtype    TotalDiff   Average
Address   Normal     15         00:10:01
Adress    vip        18         00:08:01
Address   VVIP        9         00:04:00
Address   Pass       20         00:15:00
Goldsouk  normal     45         00:18:08
Goldsouk   vip       17         00:11:36
Fashion    vip       78         00:35:25
Fashion    VVip      2          00:01:00

しかし、私は別のモデルで出力が必要です

LocName     Normal      Vip      VVip        Pass        Staff
Address     00:10:01    00:08:01  00:04:00    0           0
GoldSouck    00:18:08   00:11:36   0          0           0
Fashion      0          00:35:25   00:01:00   0           0 

だから私はピボットを使って同じストアドプロシージャを書いてみます

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 + '  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 '
  exec sys.sp_executesql @query
end

しかし、これを実行しているときに次のようなエラーが発生します。列 'Location_tbl.LocName' は、集計関数または GROUP BY 句のいずれにも含まれていないため、選択リストでは無効です。

4

0 に答える 0