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 

所以我尝试使用 pivot 编写相同的存储过程

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