2017-11-28 5 views
0

mariadb/mysql에서 select 문에서 다음과 같은 방법으로 변수를 계산할 수 있습니다. 이 간단한 예에서는 날짜 범위를 만들고 변수를 사용하여 간단한 기초 잔액과 종가 잔액을 계산하고 매일 10을 지불합니다.SELECT 문에서 MARIADB 변수 POSTGRES 동일 함

with RECURSIVE dates as (
select '2017-11-01' as `dt` 
union all 
select adddate(dt, INTERVAL 1 DAY) 
from dates 
where dt < CURDATE() 
) 

select 
@vardate:=d.dt 
, @openbal 
, @payment:= 10 
, @closebal:= @[email protected] 
, @openbal:[email protected] 
from dates d; 

내가 선택 성명에서 즉석에서 간단한 계산을 수행 할 수있는이 기술을 사용 결과 ....

╔══════════════╦════════════╦═══════════════╦═════════════╗ 
║ "ac_date" ║ "open_bal" ║ "trans_total" ║ "close_bal" ║ 
╠══════════════╬════════════╬═══════════════╬═════════════╣ 
║ "2017-11-01" ║ "0"  ║ "10"   ║ "10"  ║ 
║ "2017-11-02" ║ "10"  ║ "10"   ║ "20"  ║ 
║ "2017-11-03" ║ "20"  ║ "10"   ║ "30"  ║ 
... 

을 제공합니다. 내 질문은 PL/pgSQL 함수에서 이런 식으로 변수를 사용할 수 있습니까? 아니면 내가 간과하고있는 다른 방법이 있습니까?

+0

Postgres에서 변수가 필요하지 않습니다. 당신은 단순히 창 함수를 사용할 수 있습니다. (이후 MySQL에서'with recursive'를 할 수 있습니까?) –

+0

윈도우 함수를 사용하여 질문을하는 방법을 보여 주시겠습니까? 나는 그것이 개념적으로 도움이 될 것이라고 생각한다. 내가 일하는 쿼리는 일일이자를 계산하는 대출 일정을 생성하고 광범위하게 설명한 기술을 사용합니다. – ojf

+0

출력이 어떻게 생성되는지 설명해야합니다. 지불 금액이 '1'로 설정되어 있지만 출력에 '10'이 표시됩니다. Alos 'trans_total'은 어디에서 왔습니까? 변수 중 하나에서 –

답변

1

나는 그 문은 MariaDB에서 어떻게 작동하는지 완전히 잘 모르겠지만,이 같은 일을 할 것 같다 : 일반적으로

with vars (openbal, payment) as (
    values (0, 10) 
), balance as (
    select t.dt::date as ac_date, 
     openbal, 
     payment, 
     sum(payment) over (order by t.dt) as close_bal 
    from vars, 
     generate_series(date '2017-11-01', current_date, interval '1' day) as t(dt) 
) 
select ac_date, 
     openbal + lag(close_bal) over (order by ac_date) as open_bal, 
     payment, 
     close_bal 
from balance; 

당신이 SQL에서 sum() over (order by ...)을 사용하여 실행중인 총을 얻을 수 있습니다. 이전 행의 값에 액세스하려면 lag() 기능을 사용합니다.

창 기능을 중첩 할 수 없기 때문에 두 개의 CTE가 필요합니다.

행 목록을 생성하려면 Postgrse에서 generate_series()을 사용하십시오.