2015-06-10 4 views
0

Я хочу рассчитать max(min(150,value returned by below query),50). Как это реализовать в netezza? Мне нужно передать значение, возвращаемое приведенным ниже запросом, в вышеуказанный оператор и вычислить значение выражения. Оцените свое время и помощь.Самый большой/минимальный или максимальный/минимальный расчет в SQL

Примечание: По Мин/Макс. Я имею в виду наибольший/наименее эквивалентный SQL. Хотя в Neteeza нет наибольших/наименее функций.

SELECT (x/cast(y as float)* 100 AS sales_ratio 
FROM (SELECT a.sum(sales_amt) AS x 
     FROM table2 b, 
       table1 a, 
       table 3 c 
     WHERE b.VEND_CD IN ($vendorCD1) AND 
       b.ITM_CD_1 = ($ITMCD) AND 
       b.area_num = ($area) AND 
       b.area_num = a.area_num AND 
       b.itm_cd_2 = a.itm_cd_2 AND 
       a.week_end = c.week_end AND 
       c.week_end BETWEEN ($startdate) AND ($enddate)) t1 
CROSS JOIN (SELECT a.sum(sales_amt) AS y 
      FROM table2 b, 
        table1 a, 
        table3 c 
      WHERE b.VEND_CD IN ($vendorCD1) AND 
        b.ITM_CD_1 = ($ITMCD) AND 
        b.area_num = ($area) AND 
        b.area_num = a.area_num AND 
        b.itm_cd_2 = a.itm_cd_2 AND 
        a.week_end = c.week_end AND 
        c.week_end BETWEEN ($startdate2) AND ($enddate2)) t2 

ответ

0

Это приблизительная оценка, так как я не знаю РСУБД, которую вы используете. Общая идея состоит в том, чтобы реализовать оператор CASE для работы как комбинация MAX(MIN()), как показано на рисунке.

SELECT 
    x/cast(y AS FLOAT) * 100 AS sales_ratio 
    ,CASE 
     WHEN CASE 
       WHEN x/cast(y AS FLOAT) * 100 > 150 
        THEN 150 
       ELSE x/cast(y AS FLOAT) * 100 
       END < 50 
     THEN x/cast(y AS FLOAT) * 100 
    ELSE 50 
    END Result  
FROM (
    SELECT a.sum(sales_amt) AS x 
    FROM table2 b 
     ,table1 a 
     ,TABLE 3 c 
    WHERE b.VEND_CD IN ($VENDORCD1) 
     AND b.ITM_CD_1 = ($ITMCD) 
     AND b.area_num = ($AREA) 
     AND b.area_num = a.area_num 
     AND b.itm_cd_2 = a.itm_cd_2 
     AND a.week_end = c.week_end 
     AND c.week_end BETWEEN ($STARTDATE) 
      AND ($ENDDATE)) t1 
CROSS JOIN (
    SELECT a.sum(sales_amt) AS y 
    FROM table2 b 
     ,table1 a 
     ,table3 c 
    WHERE b.VEND_CD IN ($VENDORCD1) 
     AND b.ITM_CD_1 = ($ITMCD) 
     AND b.area_num = ($AREA) 
     AND b.area_num = a.area_num 
     AND b.itm_cd_2 = a.itm_cd_2 
     AND a.week_end = c.week_end 
     AND c.week_end BETWEEN ($STARTDATE2) 
      AND ($ENDDATE2)) t2 
+0

Было полезно. Спасибо Radu –

+0

@sql_learner Добро пожаловать. Не забудьте перевернуть/пометить как corect, если ответ вам помог, на этот вопрос и каждый раз здесь, на Stackoverflow. –

0

Общий подход использует выражение CASE хотя оно не может быть хорошо оптимизирован в Netezza (согласно другой SO ответ я обезжиренное.) Вы, вероятно, хотите, чтобы захватить результат вашего запроса в переменной, а затем применить логика, чтобы значение не выходило за пределы диапазона от 50 до 150, но я понимаю, что Netezza не разрешает переменные. Возможно, лучше всего сделать эту часть вне SQL, особенно потому, что возможность нулей является еще одним осложняющим фактором.

+0

Спасибо. Я реализовал с футляром, и он работал –

0

В версии Netezza 7.2 реализованы скалярные функции MAX и MIN, аналогичные GREATEST и LEAST.

Смежные вопросы