сумма сводных столбцов в новый столбец и вставка всех записей во временную таблицу

#tsql #stored-procedures

#tsql #хранимые процедуры

Вопрос:

я хочу получить сумму значений сводных столбцов в новый столбец и вставить выходные записи во временную таблицу

 select * from (select v.JobNo as JobNo,aj.VehicleNumber as VehicleNo,isnull(g.ImageCount,0) as ImageCount,s.ParamKey as ImageType    from dbo.Visits v       inner join (select VisitId as visit,paramkey,Value from dbo.VisitParams) s on s.visit = v.visitid       left outer join (       select VisitId,FieldId, ( COUNT(*)) as ImageCount       from dbo.vw_ImageGallery        group by FieldId,VisitId) g on s.visit = g.VisitId and g.FieldId = s.ParamKey           inner join Users u on u.UserId = v.CreatedBy  inner join AssignedJobs aj on aj.CSRCode = u.Code and aj.JobNumber = v.JobNo      where v.VisitType = 1 and v.TimeVisited >= '2019-03-01' AND v.TimeVisited <= '2019-04-01'           )as a          

PIVOT (      max([ImageCount])      FOR [ImageType] IN ([5],[20],[21]) ) as pvt order by [JobNo]
 

мой фактический вывод

 job no       vehicleno  1   2   5
---------------------------------------------------------
BL1052385     648792    0   8   0
BL1054161     CAT2410   2   8   0
BL1107290     NB 0134   0   5   0
BL1174714     GP 3784   1   7   3
 

я ожидаю, что результат будет выглядеть

 job no       vehicleno  1   2   5  Total Count
----------------------------------------------------------
BL1052385     648792    0   8   0      8
BL1054161     CAT2410   2   8   0      10
BL1107290     NB 0134   0   5   0      5
BL1174714     GP 3784   1   7   3      11
 

Ответ №1:

Я предпочитаю использовать условную агрегацию, а не pivot . Это более гибко:

 select v.JobNo, aj.VehicleNumber,
       sum(case when vp.ParamKey = 1 then g.ImageCount else 0 end) as imagetype_1,
       sum(case when vp.ParamKey = 20 then g.ImageCount else 0 end) as imagetype_20,
       sum(case when vp.ParamKey = 21 then g.ImageCount else 0 end) as imagetype_21,
       count(*) as total
from dbo.Visits v join
     dbo.VisitParams vp  
     on vp.visit = v.visitid join
     Users u
     on u.UserId = v.CreatedBy join
     AssignedJobs aj
     on aj.CSRCode = u.Code and
        aj.JobNumber = v.JobNo left outer join
     (select VisitId, FieldId, count(*) as ImageCount       
      from dbo.vw_ImageGallery ig
      group by FieldId, VisitId
     ) g
     on vp.visit = g.VisitId and
        g.FieldId = s.ParamKey
where v.VisitType = 1 and
      v.TimeVisited >= '2019-03-01' and
      v.TimeVisited <= '2019-04-01' and
      vp.ParamKey in (5, 20, 21)
group by v.JobNo, aj.VehicleNumber;        
order by v.JobNo
 

Комментарии:

1. вы получили общее количество, но я действительно хотел получить общую сумму изображений. у меня появилась идея, и это помогло мне решить мою проблему. я сделал это как подзапрос, а из основного запроса суммировал поля и получил свой результат