#sql #db2
#sql #db2
Вопрос:
У меня есть следующий запрос:
with D1 as (
select v06.ID
,AVG(TD.A) as A_avg
,AVG(TD.B) as B_avg
from v06
inner join v07 TD
on v06.ID= TD.ID
and v06.timestamp= TD.timestamp
where v06.X is not NULL
group by v06.ID
)
select * from D1
Теперь я группирую по v06.ID . Однако я хочу сохранить все поля v06, добавив только два усредненных значения из таблицы TD. Итак, я попытался:
with D1 as (
select v06.*
,AVG(TD.A) as A_avg
,AVG(TD.B) as B_avg
from v06
inner join v07 TD
on v06.ID= TD.ID
and v06.timestamp= TD.timestamp
where v06.X is not NULL
group by v06.*
)
select * from D1
Но это дает мне «недопустимый символ *» в инструкции select. Кто-нибудь знает, как этого добиться?
Комментарии:
1. У вас действительно есть это
**
в вашем заявлении?2. Общее правило GROUP BY гласит: «Если указано предложение GROUP BY, каждая ссылка на столбец в списке ВЫБОРА должна либо идентифицировать столбец группировки, либо быть аргументом функции set». Т.е. Вы не можете выбрать все столбцы подобным образом, не перечислив их также в GROUP BY — явно.
3. Нет, это я пытался подчеркнуть, в чем разница между первым и вторым запросом.
Ответ №1:
Как указано в одном из комментариев, у вас не может быть столбца в select, которого нет в GROUP BY
предложении или который используется в агрегатной функции.
Попробуйте это:
with D1 as (
select v06.ID
,AVG(TD.A) as A_avg
,AVG(TD.B) as B_avg
from v06
inner join P.B90T75 TD
on v06.ID= TD.ID
and v06.timestamp= TD.timestamp
where v06.X is not NULL
group by v06.ID
)
select d2.*, d1.a_avg, d1.b_avg
from D1
join v06 D2
on d1.id = d2.id
Ответ №2:
Или, если доступно / поддерживается [неизвестно, если в OP не упоминается платформа или выпуск DB2, и даже не включен тег DB2 для конкретной платформы], возможно, следующий запрос. Примечание: удалите или отрегулируйте скаляр приведения DEC по мере необходимости; Я просто выбрал небольшое значение, чтобы получить лучший размер отчета с моими выборочными данными, потому что в OP не было ни DDL с выборочными данными, ни ожидаемого результата, предлагаемого для тестирования:
select a.*
, dec( avg(a) over(partition by a.id ) , 11 ) as avg_a
, dec( avg(b) over(partition by a.id ) , 11 ) as avg_b
from v06 as a
join v07 as b
on a.id = b.id
and a.timestamp = b.timestamp
where x is not null
order by id
Комментарии:
1. Спасибо, похоже, это то, что я искал! Я протестирую это позже сегодня.