Как вставить среднее для каждого столбца в таблице SQL Server с условием - PullRequest
0 голосов
/ 16 августа 2011

Я создал временную таблицу с динамическими столбцами.Эти столбцы являются значениями в основной таблице.

Скажем,

Id |Name
1  |Prepaid
2  |Postpaid

, поэтому столбцы временной таблицы будут

Id Prepaid Postpaid

В этом случае столбцы являются динамическими.

рассмотрим приведенный ниже код для временной таблицы:

declare @temp as table (Id int, Prepaid float, postpaid float)

insert into @temp values(1,100,200)
insert into @temp values(1,10,500)
insert into @temp values(1,-100,-100)
insert into @temp values(1,10,200)
insert into @temp values(1,100,-100)
insert into @temp values(1,150,560)
insert into @temp values(1,90,200)

Мне нужно вставить строку со средним значением для каждого столбца.

Среднее должно быть рассчитано с использованием строк, которыесоответствовать условию, т. е. столбец не должен содержать значение -100.

Мне нужно вставить строку со средними значениями, как для указанных выше значений.

Id       PrepaidAvg      PostPaidAvg  
1     76.6666666666667  320

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Трудно точно определить, какой результат вы ожидаете, но вот одна попытка:

SELECT 
  Id, 
  PrepaidAvg = AVG(CASE WHEN Prepaid > 0 THEN Prepaid ELSE NULL END),
  PostpaidAvg = AVG(CASE WHEN postpaid > 0 THEN postpaid ELSE NULL END)
FROM @temp
GROUP BY Id;

Если это не так, вы можете получить более подробную информацию:

;WITH prepaid AS
(
  SELECT Id, PrepaidAvg = AVG(Prepaid)
    FROM @temp WHERE Prepaid > 0
), postpaid AS
(
  SELECT Id, PostpaidAvg = AVG(postpaid)
    FROM @temp WHERE postpaid > 0
)
SELECT Id = COALESCE(prep.Id, postp.Id),
  prep.PrepaidAvg,
  postp.PostpaidAvg
FROM prepaid AS prep
FULL OUTER JOIN postpaid AS postp
ON prep.Id = postp.Id;
0 голосов
/ 16 августа 2011

Используйте этот запрос

insert into @temp 
select avg(Id), avg(Prepaid), avg(postpaid)
from @temp 
where Prepaid <> -100 and postpaid <> -100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...