2017-01-03 3 views
0

Я пытаюсь объявить переменную с именем NEW_VARIABLE, которая равна (end_date - start_date). Затем я использую переменную NEW_VARIABLE ниже в качестве интервала (date1 + NEW_VARIABLE + interval '1 days').Объявление переменной в инструкции SELECT

CREATE TEMPORARY TABLE tmp1_variables AS (
    SELECT 
     '2016-10-29'::date as start_date, 
     dateadd(day,-10,getdate())::date as end_date, 
     '2015-10-31'::date as date1 
     (end_date - start_date) as NEW_VARIABLE 
); 

DROP TABLE IF EXISTS tmp_tbl1; 
CREATE TEMPORARY TABLE tmp_tbl1 (cobrand_id int, xsum numeric(30,15)); 

insert into tmp_tbl1 (cobrand_id, xsum) 
select q1.cobrand_id, q1.a/q2.d as xsum from (
    SELECT cobrand_id, sum(calc) AS a FROM jwn_calc s, tmp1_variables 
    where s.optimized_transaction_date > start_date AND s.optimized_transaction_date <= end_date + interval '1 days' GROUP BY cobrand_id 
) as q1 
inner join (
    SELECT cobrand_id AS c, 
    sum(CASE WHEN optimized_transaction_date > date1 AND optimized_transaction_date <= date1 + NEW_VARIABLE + interval '1 days' THEN Calc END)/
    sum(CASE WHEN optimized_transaction_date > date1 AND optimized_transaction_date <= date1 + interval '91 days' THEN Calc END) AS d 
    FROM jwn_calc, tmp1_variables 
    GROUP BY cobrand_id 
) as q2 on q1.cobrand_id = q2.c; 
+1

Примеры данных и желаемые результаты будут творить чудеса, чтобы объяснить, что вы хотите сделать. –

+0

Привет, Гордон, я хотел исправить синтаксис на этом, а не искать желаемый результат. Как я могу объявить (end_date - start_date) как переменную, когда я создал переменные end_date и start_date в одном и том же предложении select? Это возможно? – ZJAY

ответ

0

Там нет нет переменных в SQL вообще. Просто таблицы, столбцы и выражения. Итак, очевидно, что вы не можете «объявить переменную» для начала. Неправильная терминология легко внушает неадекватный подход ...

Также dateadd() и getdate()? Возможно, вы думаете о MS SQL Server. Эти функции не существуют в Postgres.

В любом случае, использовать подзапрос (или КТР), чтобы построить новое выражение от постоянного ввода:

CREATE TEMP TABLE tmp1_variables AS (
SELECT *, end_date - start_date AS new_variable 
FROM (
    SELECT date '2016-10-29' AS start_date 
     , CURRENT_DATE - 10 AS end_date 
     , date '2015-10-31' AS date1 
    ) sub 
); 

Отображения правильного синтаксиса Postgres.

В Postgres вы можете просто добавить/вычесть integer в/из date (но не timestamp).
И если вы добавите interval в date, вы получите timestamp.

Конечно, можно привести результат обратно date:

(date1 + new_variable + interval '1 days')::date 

Но вместо вычисления date начать с:

date1 + new_variable + 1 

Помимо: котируемые идентификаторы отлиты в нижний регистр в Postgres ,