I need to write a summary report on 3 different status values, with a count and an amount column for each status, with the results presented in a single table. For example, the output would look like this:

The query to produce each line of code (in an individual output) is:
select case when status_key = '2' then 'Paid' else '' end as 'Status'
, COUNT(BillNo) as [Count]
, SUM(amtpd) as [Amount Paid]
from billtable
where client = 101
and status_key = '2'
group by status_key
select case when status_key = '1' then 'Queued' else '' end as 'Status'
, COUNT(BillNo) as [Count]
, SUM(amtpd) as [Amount Paid]
from billtable
where client = 101
and status_key = '1'
group by status_key
select case when status_key = '4' then 'Hold' else '' end as 'Status'
, COUNT(BillNo) as [Count]
, SUM(amtpd) as [Amount Paid]
from billtable
where client = 101
and status_key = '4'
group by status_key
This produces three results like:

I am using SQL Server database and SSMS to develop the query.
No need for union.
Use WHERE to filter to only the status_keys that you want, then expand you CASE statement to re-code from a number to a word.
EDIT Modified example using a dimension table
You can then have a foreign key constraint from
statustobilltable. This will ensure that data can not be inserted intobilltableunless there is a corresponding key instatus.Your lookups will then always work. But at the ‘cost’ of inserts failing if the
statustable has not been correctly populated.This
fact-tableanddimension-tableconstruction is the underpinning of relational database design.