By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
create table userdata(userid varchar(10),sex varchar(1),state varchar(2),race varchar(1));
insert into userdata values
('usr1','M','PA','B')
,('usr2','F','TX','W')
,('usr3','M','TX','B')
,('usr4','D','NE','H')
,('usr5','F','TX','A')
;
select * from userdata;
userid | sex | state | race |
---|---|---|---|
usr1 | M | PA | B |
usr2 | F | TX | W |
usr3 | M | TX | B |
usr4 | D | NE | H |
usr5 | F | TX | A |
WITH upvt AS (
SELECT *
FROM (
SELECT
COUNT(ud.userid) AS Total
, SUM(CASE WHEN ud.sex = 'M' THEN 1 END) AS Male
, SUM(CASE WHEN ud.sex = 'F' THEN 1 END) AS Female
, SUM(CASE WHEN ud.sex = 'D' THEN 1 END) AS Declined
, SUM(CASE WHEN ud.state = 'tx' THEN 1 END) AS [In State]
, SUM(CASE WHEN ud.state <> 'tx' THEN 1 END) AS [Out State]
, SUM(CASE WHEN ud.race = 'B' THEN 1 END) AS Black
, SUM(CASE WHEN ud.race = 'W' THEN 1 END) AS White
, SUM(CASE WHEN ud.race = 'H' THEN 1 END) AS Hispanic
, SUM(CASE WHEN ud.race = 'A' THEN 1 END) AS Asian
FROM UserData ud
) p
UNPIVOT (
Totals FOR Category IN (Total, Male, Female, Declined, [In State], [Out State], Black, White, Hispanic, Asian)
) AS up
)
SELECT
u.Category
, u.Totals
, (CAST(u.Totals AS FLOAT) / CAST(u2.Totals AS FLOAT)) * 100 AS Percentage
FROM upvt u
CROSS JOIN (
SELECT * FROM upvt WHERE Category = 'Total'
) u2
Category | Totals | Percentage |
---|---|---|
Total | 5 | 100 |
Male | 2 | 40 |
Female | 2 | 40 |
Declined | 1 | 20 |
In State | 3 | 60 |
Out State | 2 | 40 |
Black | 2 | 40 |
White | 1 | 20 |
Hispanic | 1 | 20 |
Asian | 1 | 20 |
Warning: Null value is eliminated by an aggregate or other SET operation.