Выражения в фактах

Добрый день есть необходимость посчитать следующий факт:

(if(accept_cnt>=0 and measuretype_name = 'Факт',sum(nvl(tariff,0))/100, 0)):rcpn_outcom

судя по логу строится следующий запрос:

SELECT (CASE WHEN (accept_cnt >= 0) AND (measuretype_name = 'Факт') THEN sum(nvl(tariff,0)) / 100 ELSE 0 END) as rcpn_outcom
FROM (КУБ)

запрос падает с ошибкой

 Column "DQMON_transfer.accept_cnt" must appear in the GROUP BY clause or be used in an aggregate function

что делаю не так? почему формируется невалидный запрос? и как поправить
конфиг на всякий случай:

display: {
    headerStyle: {},
    rotateXLabel: '45',
  },
  options: [
    'DisplayAllBadges',
  ],
  dataSource: {
    koob: 'Vertica_dwh_luxms_svc_r00.DQMON_transfer',
    style: {
      measures: {
        rcpn_outcom: {
          title: 'Доход от приема',
          format: '# ### [тыс, млн, млрд, тера]',
        },
      },
    },
    xAxis: 'mrc',
    yAxis: 'measures',
    sortBy: '-rcpn_outcom',
    filters: {
      mrc: [
        '!=',
        'null',
      ],
    },
    measures: [
      "(if(accept_cnt>=0 and measuretype_name = 'Факт',sum(nvl(tariff,0))/100, 0)):rcpn_outcom",
    ],
    hierarchy: [
      'ufps=>pochtamt=>index_ops',
    ],
    dimensions: [
      'mrc',
    ],
  },
  view_class: '1II.column',
  title: 'Сведения о доходе',

Добрый день, Роман! Подскажите, пожалуйста, какой ожидаете результат: относительно чего должна быть посчитана сумма в условии? относительно dimension mrc? или каких-то других полей?

да, верно относительно mrc.
хотелось бы получить результат по аналогии с запросом:

select 
mrc,
(nvl(sum(tariff),0)/100)
from DQMON.mt_2
WHERE accept_cnt >=0
and measuretype_name= 'Факт'
and mrc is not null
group by mrc

и даже более того на одном графике есть необходимость считать разные факты при различных условиях:

measures: [
      "(if(accept_cnt>0 and measuretype_name = 'Факт',sum(nvl(tariff,0))/100, 0)):rcpn_outcom",
      "(if(payment_cnt>0 and measuretype_name = 'Факт',sum(nvl(tariff,0))/100, 0)):rcpn_incom",
    ],

или например в одной таблице:

measures: [
      'sum(nvl(accept_cnt,0)):kol_acc_tr',
      "if(pay_type_sndr='Банковская карта' and category_name='Внутренний перевод' and (client_type = 'C-C' or client_type = 'C-B'),sum(nvl(accept_cnt,0)),0):oplata_kartoi",
      "if(pay_type_sndr='Банковская карта' and category_name='Внутренний перевод' and (client_type = 'C-C' or client_type = 'C-B'),sum(nvl(accept_cnt,0)),0)/if(category_name='Внутренний перевод' and (client_type = 'C-C' or client_type = 'C-B'),sum(nvl(accept_cnt,0)),1):dolya_oplat_kartoi",
      'sum(nvl(accepted_amt,0)):vol_trans',
      "if(payment_cnt>0 and measuretype_name='Факт', sum(nvl(tariff,0)) ,0):doxod_vruchenia",
      "if(accept_cnt>0 and measuretype_name='Факт', sum(nvl(tariff,0)) ,0):doxod_priema",
      "if(measuretype_name='План', sum(nvl(tariff,0)) ,0):plan",
      "if(measuretype_name='Факт', sum(nvl(tariff,0))/100, 0)/if(measuretype_name='План', sum(nvl(tariff,0)) ,1):percent_plan",
      "if(measuretype_name='Факт', sum(nvl(tariff_val,0)), 0)/sum(nvl(accept_cnt,0))/100:avg_doxod_transfer",
      'sum(nvl(accepted_amt,0))/sum(nvl(accept_cnt,0)):avg_bill',
      "if(measuretype_name='Факт' and pay_type_sndr='Банковская карта', sum(nvl(accepted_amt,0)), 0)/if(pay_type_sndr='Банковская карта', sum(nvl(accept_cnt,0)), 1):avg_bill_card",
      "if(measuretype_name='Факт' and pay_type_sndr='Наличный расчет', sum(nvl(accepted_amt,0)), 0)/if(pay_type_sndr='Наличный расчет', sum(nvl(accept_cnt,0)), 1):avg_bill_cash",
    ],

и все относительно

dimensions: [
      'mrc',
    ],

Роман, возвращаюсь с рекомендациями.
Самым эффективным решением будет создание отдельных dimension-ов из Вашиз lpe выражений.

Например, создать отдельный дименшен в кубе с названием oplata_kartoi с типом SUM
Из этого:
“if(pay_type_sndr=‘Банковская карта’ and category_name=‘Внутренний перевод’ and (client_type = ‘C-C’ or client_type = ‘C-B’),sum(nvl(accept_cnt,0)),0):oplata_kartoi”,

Получилось это:
CASE WHEN pay_type_sndr=‘Банковская карта’ and category_name=‘Внутренний перевод’ and (client_type = ‘C-C’ or client_type = ‘C-B’) THEN nvl(accept_cnt,0) ELSE 0 END

А далее в конфиге дешлета указать/выбрать sum(oplata_kartoi)

Или вот так:
Из этого:
“if(accept_cnt>0 and measuretype_name=‘Факт’, sum(nvl(tariff,0)) ,0):doxod_priema”,
Получилось это
CASE WHEN accept_cnt>0 and measuretype_name=‘Факт’ THEN nvl(tariff,0) ELSE 0 END

затем в конфиге деша прописываем sum(doxod_priema)

Надеюсь, что подход понятен и мне получилось решить Вашу задачу.

Как-то так должно получиться

{
  frame: {
    h: 5,
    w: 4,
    x: 0,
    y: 0,
  },
  dataSource: {
    koob: 'luxmsbi.custom_customers',
    style: {},
    xAxis: 'country',
    yAxis: 'measures',
    measures: [
      'sum(q1):customer_id',
      'sum(q2):customer_id2',
 и т.д.
    ],
    dimensions: [
      'country',
    ],
  },
  view_class: '1II.column',
  title: '',
}

Ещё раз добрый день, Роман! @roman_stepanov
Также есть ещё один вариант решить Ваш вопрос
Вместо таких measures

measures: [
      "(if(accept_cnt>0 and measuretype_name = 'Факт',sum(nvl(tariff,0))/100, 0)):rcpn_outcom",
      "(if(payment_cnt>0 and measuretype_name = 'Факт',sum(nvl(tariff,0))/100, 0)):rcpn_incom",
    ],

Написать вот такие

measures: [
      "sum(if(accept_cnt>0 and measuretype_name = 'Факт',nvl(tariff,0)/100, 0)):rcpn_outcom",
      "sum(if(payment_cnt>0 and measuretype_name = 'Факт',nvl(tariff,0)/100, 0)):rcpn_incom",
    ],

Это должно сработать