MSSQL -> Postgresql 쿼리 질문입니다 0 1 1,031

by 이명수 [SQL Query] mssql postgresql [2021.04.09 15:46:25]



안녕하세요,

MSSQL 쿼리문을 실무에서 사용하다 동일한 쿼리문을 Postgresql 쿼리문으로 바꿔 사용하려 합니다.

문법이 조금 다른 관계로 검색해보면서 쿼리문을 수정해보았는데, 잘 되지 않아서 도움을 요청드립니다.

감사합니다.

(MSSQL 쿼리문은 다음과 같습니다.)

declare @time_start datetime
declare @time_end datetime
declare @temptable table(StartDate varchar(10),EndDate varchar(10), Connect_Count nvarchar(512))
declare @temptable2 table(StartDate varchar(10),EndDate varchar(10), Use_VM_Count nvarchar(512))
declare @i int
declare @day_start datetime
declare @cc int    

set @time_start='2020-01-01'  --조회 시작날짜
set @time_end='2020-12-31'  -- 조회 종료날짜


------- 1. 일별 접속 횟수 Query----------------------------------------------
set @i=DATEPART(dd,@time_start)
set @day_start=@time_start

while @i<=DATEdiff(d,@time_start,@time_end+1)
begin

-- 데이터 조회
    SELECT distinct @cc=count(ed.StrValue)
    FROM dbo.event_historical AS ev,
    dbo.event_data_historical AS ed
    WHERE ev.EventID = ed.EventID
    And ed.Name='UserDisplayName'
    and ev.EventType='BROKER_USERLOGGEDIN'  
    and ev.Time between @day_start and @day_start+1

-- 조회된 데이터 임시테이블에 Insert
    insert into @temptable
        values(convert(varchar(10),@day_start,120)
        ,convert(varchar(10),@day_start+1,120)
        ,@cc)
    
    set @day_start=dateadd(d,1,@day_start)
    set @i=@i+1
    
end

set @day_start=''
set @i=0
set @cc=0

-- Insert된 임시 테이블 조회
select *
from @temptable

------- 2. 일별 사용된 VM 수 Query----------------------------------------------
set @i=DATEPART(dd,@time_start)
set @day_start=@time_start
while @i<=DATEdiff(d,@time_start,@time_end+1)
begin

-- 데이터 조회
    select @cc = COUNT(*)
    from
    (
    SELECT distinct ed.StrValue, ev.Node
    FROM dbo.event_historical AS ev
    LEFT OUTER JOIN dbo.event_data_historical AS ed
    ON ev.EventID = ed.EventID
    WHERE (ev.EventType='AGENT_PENDING' or ev.EventType='AGENT_DISCONNECTED' or ev.EventType='AGENT_ENDED')
    and ed.Name='UserDisplayName'
    and ev.Time between @day_start and @day_start+1
    )a
    
-- 조회된 데이터 임시테이블에 Insert
    insert into @temptable2
        values(convert(varchar(10),@day_start,120)
        ,convert(varchar(10),@day_start+1,120)
        ,@cc)
    
    set @day_start=dateadd(d,1,@day_start)
    set @i=@i+1
    
end

set @day_start=''
set @i=0
set @cc=0

-- Insert된 임시 테이블 조회
select *
from @temptable2

 

by 마농 [2021.04.12 10:04:05]

일별 루프 돌려가면서 집계결과를 임시테이블에 입력하는데?
이렇게까지 복잡하게 할 필요가 있는지 모르겠네요.
그룹바이 집계쿼리로 쉽게 해결될 문제일 듯 합니다.
 

SELECT TO_CHAR(ev.time, 'yyyy-mm-dd') StartDate
     , COUNT(ed.StrValue) Connect_Count
  FROM event_historical ev
 INNER JOIN event_data_historical ed
    ON ev.eventid    = ed.eventid
 WHERE ed.name       = 'UserDisplayName'
   AND ev.eventtype  = 'BROKER_USERLOGGEDIN'  
   AND ev.time      >= DATE '2020-01-01'
   AND ev.time      <  DATE '2020-12-31' + 1
 GROUP BY TO_CHAR(ev.time, 'yyyy-mm-dd')
 ORDER BY StartDate
;
SELECT StartDate
     , COUNT(*) Use_VM_Count
  FROM (SELECT DISTINCT
               TO_CHAR(ev.time, 'yyyy-mm-dd') StartDate
             , ed.StrValue
             , ev.Node
          FROM event_historical ev
         INNER JOIN event_data_historical ed
            ON ev.eventid    = ed.eventid
         WHERE ed.name       = 'UserDisplayName'
           AND ev.eventtype IN ('AGENT_PENDING', 'AGENT_DISCONNECTED', 'AGENT_ENDED')
           AND ev.time      >= DATE '2020-01-01'
           AND ev.time      <  DATE '2020-12-31' + 1
        ) a
 GROUP BY StartDate
 ORDER BY StartDate
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입