Search code examples
sqlsql-serverwindow-functionspercentage

Create a column that calculates the percentage of the total value of the previous column


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%

Solution

  • 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