0

我有一个这样的存储过程:

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 ..但我不知道如何使用它?如果有人知道,请帮我找出答案..我无法硬线我的 vtype..actulay vtype 是动态的。它来自 Vtype Table..如果有人知道如何解决这个问题..请帮我找出答案

4

1 回答 1

0

您可以手动旋转:

ALTER procedure [dbo].[performance]
(
    @startdate nvarchar(100), 
    @enddate nvarchar(100)
)
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 (
        select
            l.LocName, v.Vtype,
            sum(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 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
于 2013-09-15T06:57:03.060 回答