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
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.
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.
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.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With