Условное агрегирование в SQL Server на основе значения столбца - PullRequest
0 голосов
/ 31 мая 2019

Мои данные выглядят примерно так:

IdType     Date        ActualEst      Value     PriceType
  1        01-06         A            1          Settle
  1        02-06         A            2          Settle
  1        02-06         F            3          Settle
  1        03-06         A            4          Settle
  2        01-06         A            5          Settle
  2        02-06         A            6          Settle
  2        03-06         F            7          Settle

Я хочу сделать среднее значение для столбца «Значение», группируя его по столбцам «IdType» и «PriceType», например, для определенной даты (столбец), ActualEst имеет записи как для «A», так и для «F», я выбираю «A» вместо «F», в противном случае любой из них, если для даты существует только один из них.

Итак, для приведенных выше данных Iследует выбрать эти записи для усреднения. Значение:

IdType      Date           ActualEst       Value     PriceType
  1          01-06           A              1          Settle
  1          02-06           A              2          Settle
  1          03-06           A              4          Settle

на дату 02-06 существуют записи «A» и «F», и я отдаю приоритет «A», если оба типа записей существуют длядата.

вторая группа ..

IdType      Date           ActualEst       Value     PriceType
  2          01-06           A              5          Settle
  2          02-06           A              6          Settle
  2          03-06           F              7          Settle

и т. д. *

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

С UNION ALL вы получаете строки, по которым вы будете группировать:

select * from tablename where ActualEst = 'A'
union all
select t.* from tablename t where ActualEst = 'F'
and not exists (
  select 1 from tablename
  where IdType = t.IdType and Date = t.Date and ActualEst = 'A'
)

Тогда используйте это так:

select
  t.IdType, t.Date, avg(value) averagevalue
from (
    select * from tablename where ActualEst = 'A'
    union all
    select t.* from tablename t where ActualEst = 'F'
    and not exists (
      select 1 from tablename
      where IdType = t.IdType and Date = t.Date and ActualEst = 'A'
    )
) t
group by t.IdType, t.Date
0 голосов
/ 31 мая 2019

Row_number () строк в соответствии с необходимым приоритетом и выбрать только строки с самым высоким приоритетом:

with tbl as ( 
    -- source data
    select * from
    (values 
         (1 ,'01-06','A',1,'Settle')
        ,(1 ,'02-06','A',2,'Settle')
        ,(1 ,'02-06','F',3,'Settle')
        ,(1 ,'03-06','A',4,'Settle')
        ,(2 ,'01-06','A',5,'Settle')
        ,(2 ,'02-06','A',6,'Settle')
        ,(2 ,'03-06','F',7,'Settle')
    ) t (IdType, [Date],ActualEst,Value,PriceType)
), 
-- the query
prioritized as(
    select IdType, [Date],ActualEst,Value,PriceType,
      rn = row_number() over(partition by IdType, [Date] order by ActualEst)
    from tbl
)
select IdType, [Date], avg(value) v
from prioritized 
where rn=1
group by IdType, [Date];
...