2017-01-03 120 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

嗨戈登,我正在寻找修复这一个语法,而不是寻求一个理想的结果。当我在同一个select语句中创建变量end_date和start_date时,如何将变量声明为(end_date - start_date)作为变量?这可能吗? – ZJAY

回答

0

没有变量SQL可言。只是表格,列和表达式。 所以,显然你不能“宣布一个变量”开始。错误的术语容易激发不足的方法...

另外,dateadd()getdate()?你可能会想到MS SQL Server。这些函数在Postgres中不存在。

无论哪种方式,使用子查询(或CTE)从恒定输入建立新的表达:

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中,您可以在date(而不是timestamp)之间添加/减去integer
如果您将一个interval添加到date,您将得到一个timestamp

当然,你可以把结果返回到date

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

反倒是计算date开始与:

date1 + new_variable + 1 

旁白:不带引号的标识符转换为降低Postgres的情况下, 。