В DB2 я пытаюсь получить отдельные поля в GROUP BY, а также получить среднее значение определенных значений в каждой строке.
Я думаю, проблема в том, что я пытаюсь использовать CASE в предложении AVG.
SELECT
number,
customer,
group,
groupDetail,
category,
detail,
detailName,
avg(countOfSales),
avg(annuals),
avg(case when trajectory is null then 0 else trajectory end as trajectory),
avg(annualsLocation),
avg(case when trajLocation is null then 0 else trajLocation end as trajLocation),
avg(annualsWhole),
avg(case when trajWhole is null then 0 else trajWhole end as trajWhole)
FROM salesReporting
WHERE customer = 123
group by number,customer,group,groupDetail,category,detail,detailName
ORDER BY customer,groupDetail,category,detail ASC
В нем говорится, что «AS» не ожидается в качестве токена, и я думаю, что это в моем первом CASE в AVG.
Итак, с:
customer | group | groupDetail | category | detail | detailName | countOfSales | annuals | trajectory | annualsLocation | trajLocation | annualsWhole | trajWhole
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
123 1 Atl. Sls New NewLoc 12345 2948 124.84 8372 246.08 8372 28.84
123 1 Atl. Sls New NewLoc 12345 2345 164.84 4839 234.08 4839 26.63
123 1 Atl. Sls New NewLoc 12345 6523 224.84 2345 654.08 2345 29.85
123 1 Atl. Sls New NewLoc 12345 3456 134.84 5434 152.08 5434 25.34
123 1 Atl. Sls New NewLoc 12345 3426 124.84 6234 245.08 6234 28.84
я бы хотел
customer | group | groupDetail | category | detail | detailName | countOfSales | annuals | trajectory | annualsLocation | trajLocation | annualsWhole | trajWhole
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
123 1 Atl. Sls New NewLoc /*and all of these columns to be the respective averages of the matching columns above*/
Как я могу добиться этого в DB2?


Это проблема синтаксиса, псевдоним "траектория должен быть вне скобки avg.
Например:
avg(case when trajectory is null then 0 else trajectory end) as trajectory
Я предполагаю, что это связано с клиентской программой / приложением, которое отображает вывод запроса выбора. Я бы попытался явно выдать вывод. Например: скажем, как десятичное, чтобы увидеть, помогает ли это ===> cast (round (<col>, 2) as decimal)
Тип результата зависит от типа ввода. См. Справочную страницу ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/… "Тип данных и атрибут длины результата такие же, как тип данных и атрибут длины первого аргумента, за исключением того, что точность увеличивается на единицу, если числовое выражение1 DECIMAL, а точность равна менее 31 "
Эта логика гораздо проще записать с использованием coalesce():
avg(coalesce(trajectory, 0)) as trajectory,
. . .
Ах, хороший улов! Не могу поверить, что я это пропустил, спасибо ... Вы также знаете, почему при использовании round (, 2) фактическое число округляется до двух цифр после десятичной дроби, но по-прежнему остается след нулей?