Below I have a query that gives me the monthly total by state, with the last column giving me the yearly total. I want to create a column that gives me the percentage of the total by state.
Here is what I already have
SELECT STATE,
ROUND(SUM(CASE WHEN LOADDATE = '2022-02-07' THEN TNET END),0) AS JAN_TOTALREV,
ROUND(SUM(CASE WHEN LOADDATE = '2022-03-07' THEN TNET END),0) AS FEB_TOTALREV,
ROUND(SUM(CASE WHEN LOADDATE = '2022-04-07' THEN TNET END),0) AS MAR_TOTALREV,
ROUND(SUM(CASE WHEN LOADDATE = '2022-05-07' THEN TNET END),0) AS APR_TOTALREV,
ROUND(SUM(CASE WHEN LOADDATE = '2022-06-07' THEN TNET END),0) AS MAY_TOTALREV,
ROUND(SUM(CASE WHEN LOADDATE = '2022-07-07' THEN TNET END),0) AS JUN_TOTALREV,
ROUND(SUM(CASE WHEN LOADDATE = '2022-08-07' THEN TNET END),0) AS JUL_TOTALREV,
ROUND(SUM(CASE WHEN LOADDATE = '2022-09-07' THEN TNET END),0) AS AUG_TOTALREV,
ROUND(SUM(CASE WHEN LOADDATE = '2022-10-07' THEN TNET END),0) AS SEP_TOTALREV,
ROUND(SUM(CASE WHEN LOADDATE = '2022-11-07' THEN TNET END),0) AS OCT_TOTALREV,
ROUND(SUM(CASE WHEN LOADDATE = '2022-12-07' THEN TNET END),0) AS NOV_TOTALREV,
ROUND(SUM(CASE WHEN LOADDATE = '2023-01-07' THEN TNET END),0) AS DEC_TOTALREV,
ROUND(SUM(TNET),0) AS YEAR_TOTALREV
FROM [dbo].example]
WHERE LOADDATE BETWEEN '2022-02-01' AND '2023-01-31'
GROUP BY STATE
Below is what I would like the last two columns to look like
STATE | YEAR_TOTALREV | Column B |
---|---|---|
AL | 1000 | 10% |
NE | 3000 | 30% |
NY | 6000 | 60% |
As commented by Dale K, we can compute the grand total of the sums of all states with window functions:
SELECT STATE,
ROUND(SUM(CASE WHEN LOADDATE = '2022-02-07' THEN TNET END), 0) AS JAN_TOTALREV,
. . .
ROUND(SUM(TNET), 0) AS YEAR_TOTALREV,
100.0 * SUM(TNET)
/ NULLIF(SUM(SUM(TNET)) OVER(), 0) AS PCT
FROM [dbo].example]
WHERE LOADDATE BETWEEN '2022-02-01' AND '2023-01-31'
GROUP BY STATE