Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PostgreSQL equivalent for SQL Server GROUP BY WITH ROLLUP

I have an Sql Server Query that is using the ROLLUP clause while grouping. I want an equivalent query in Postgres. Query in SQl Server is:

SELECT (CASE WHEN acnt_dba_name Is Null THEN 'Total' ELSE acnt_dba_name END) as account,
       (CASE WHEN evt_name Is Null THEN '' ELSE evt_name END) as event, 
       COUNT(CASE reg_is_complete WHEN true THEN 1 ELSE Null END) as regsComplete,
       COUNT(CASE WHEN reg_frn_pro_id > 0 AND reg_is_complete = false THEN 1 ELSE Null END) as regsInComplete,
       COUNT(CASE WHEN reg_frn_pro_id > 0 THEN Null ELSE 1 END) as regsClicks
FROM      registrations_view 
LEFT JOIN events ON (evt_id = reg_frn_evt_id)
LEFT JOIN accounts ON (acnt_id = evt_frn_acnt_id)
WHERE reg_date_created < #CreateODBCDate(url.endDate)#
AND   reg_date_created > #CreateODBCDate(url.startDate)#
AND   reg_is_active = true      -- only active regs
AND   reg_is_test = false       -- only live registrations
-- AND  reg_is_denied = false         -- exclude denied reg statuses (include these for now RWB 8/7/2)
GROUP BY rollup(acnt_dba_name, evt_name)
-- Sort with Nulls at the bottom
ORDER BY acnt_dba_name, evt_name
like image 898
Satish Sharma Avatar asked Dec 21 '12 13:12

Satish Sharma


People also ask

What is a rollup Postgres?

The PostgreSQL ROLLUP belongs to the GROUP BY clause that provides a short cut for defining multiple grouping sets. Multiple columns grouped together forms a group set. Unlike the CUBE subclause, ROLLUP does not yield all possible grouping sets based on the specified columns. It just makes a subset of those.

What is group by in PostgreSQL?

The PostgreSQL GROUP BY clause is used in collaboration with the SELECT statement to group together those rows in a table that have identical data. This is done to eliminate redundancy in the output and/or compute aggregates that apply to these groups.

What is group by rollup in SQL?

GROUP BY ROLLUP is an extension of the GROUP BY clause that produces sub-total rows (in addition to the grouped rows). Sub-total rows are rows that further aggregate whose values are derived by computing the same aggregate functions that were used to produce the grouped rows.

What is Cube in PostgreSQL?

In PostgreSQL, CUBE is used to generate multiple grouping sets at once. It is a subclass of the GROUP BY clause and comes in handy while generating multiple grouping sets. A grouping set is a set of columns to which you want to group.


1 Answers

with detail as (
    select
        acnt_dba_name as account,
        evt_name as event, 
        count(case reg_is_complete when true then 1 else null end) as regscomplete,
        count(case when reg_frn_pro_id > 0 and reg_is_complete = false then 1 else null end) as regsincomplete,
        count(case when reg_frn_pro_id > 0 then null else 1 end) as regsclicks
    from
        registrations_view 
        left join
        events on evt_id = reg_frn_evt_id
        left join
        accounts on acnt_id = evt_frn_acnt_id
    where
        reg_date_created < #CreateODBCDate(url.endDate)#
        AND reg_date_created > #CreateODBCDate(url.startDate)#
        and reg_is_active = true        -- only active regs
        and reg_is_test = false     -- only live registrations
    group by acnt_dba_name, evt_name
), account as (
    select
        account,
        '' as event, 
        sum(regscomplete) as regscomplete,
        sum(regsimcomplete) as regsincomplete,
        sum(regsclicks) as regsclicks
    from detail
    group by account
), total as (
    select
        'Total' as account,
        '' as event, 
        sum(regsComplete) as regsComplete,
        sum(regsImComplete) as regsInComplete,
        sum(regsClicks) as regsClicks
    from account
)
select * from detail
union
select * from account
union
select * from total
order by account, event
like image 100
Clodoaldo Neto Avatar answered Sep 29 '22 15:09

Clodoaldo Neto