Из приведенного ниже sql я могу получить вывод как статус и AVG_PROD_COUNT.

Мой вопрос: когда account_num = 'A128' или 'A126', мне нужно использовать
"( dpc.product_id = cpp.product_id OR dpc.product_id = 999) ". Я попытался использовать статистику дел. Я новичок в sql, не могу получить вывод. Может любой, пожалуйста, помогите в этом.

Таблица cpp есть

Account_num

Pakage_id

Код товара


ВЫБЕРИТЕ средн. Статус,

SUM(avg.AVG_PROD_COUNT) AVG_PROD_COUNT
FROM
(SELECT
  DECODE(dpc.product_id,999,'SUSPEND','ACTIVE') status,
  dpc.product_id,
  dpc.package_id,
  ROUND(SUM(dpc.product_count)/ (to_date( '$billDate' ,'YYYYMMDD') - add_months(to_date( '$billDate' ,'YYYYMMDD'), -1)), 2) AVG_PROD_COUNT
FROM dailyproductcount dpc,      
  cust_pkg_prod cpp
WHERE dpc.rating_acct_nbr = cpp.account_num   
AND dpc.rating_acct_nbr not in('A128','A126') 
AND dpc.activity_dat BETWEEN add_months(to_date( '$billDate' ,'YYYYMMDD'), -1) AND to_date( '$billDate' ,'YYYYMMDD')-1
AND (dpc.product_id = cpp.package_id
OR dpc.product_id   =999) 
AND dpc.package_id  = cpp.package_id
GROUP BY dpc.product_id,
  dpc.package_id
) AVG
sql
0
user3274607 10 Окт 2014 в 19:47

2 ответа

Лучший ответ
  1. Приведенный выше sql не будет работать, потому что в родительском запросе нет "GROUP BY avg.status"

  2. Насколько я понимаю, вам нужно что-то подобное в условии WHERE (я предполагаю, что вы используете Oracle):

    ...
    ГДЕ dpc.rating_acct_nbr = cpp.account_num
    И dpc.activity_dat МЕЖДУ add_months (to_date ('$ billDate', 'ГГГГММДД'), -1) И to_date ('$ billDate', 'ГГГГММДД') - 1
    И dpc.package_id = cpp.package_id
    И (dpc.product_id = 999 OR dpc.product_id = decode (dpc.rating_acct_nbr, 'A126', cpp.product_id, 'A128', cpp.product_id, cpp.package_id) )
    ...

Если вы хотите использовать CASE, условие
«product_id = decode (dpc.rating_acct_nbr, 'A126', cpp.product_id, 'A128', cpp.product_id, cpp.package_id) будет выглядеть так:

product_id = case when dpc.rating_acct_nbr in ('A126', 'A128') then cpp.product_id else cpp.package_id end
0
Multisync 10 Окт 2014 в 20:19
Большое спасибо за вашу помощь .. Я могу видеть результат.
 – 
user3274607
10 Окт 2014 в 20:17
User3274607 можете ли вы описать, что это означает с точки зрения вашей структуры? "получить как 'АКТИВНО', так и 'ПОДВЕСИТЬ'"
 – 
Multisync
21 Окт 2014 в 16:40

У вас ошибка в логике или, возможно, опечатка -

(dpc.product_id = cpp.package_id
OR dpc.product_id   =999) 
AND dpc.package_id  = cpp.package_id

Функционально эквивалентно

dpc.package_id  = cpp.package_id

Это препятствует тому, чтобы dpc.product_id =999 когда-либо заставляло ваше предложение where оцениваться как истинное.

0
Politank-Z 10 Окт 2014 в 20:03
Функционально это правда, мне нужно оценить на основе account_num, если «A128» или «A126», то мне нужно сопоставить на основе product_id вместо package_id
 – 
user3274607
10 Окт 2014 в 20:10