SQL: Conditional Calculations by Group

40 Views Asked by At

I am working on Netezza SQL.

I have the following table:

  var1 var2 var3
1    a    c    e
2    a    d    f
3    a    c    f
4    b    d    e
5    b    c    f
6    b    d    f

My Problem: I am trying to perform the following types of calculations:

Level 1:

  • When var1 = A, what counts and percentage of rows are: A (i.e. A/A+B * 100) and B (i.e. B/A+B * 100)

Level 2:

  • When var1 = A : What counts and percentage of rows are: C (i.e. C/C+D when var1=A) and D (i.e. D/D+C when var1 =A)
  • When var1 = B : What counts and percentage of rows are: C (i.e. C/C+D when var1=B) and D (i.e. D/D+C when var1 =B)

Level 3:

  • When var1 = A and Var2 = C: What counts and percentage of rows are : E (i.e. E/E+F when Var1 = A and Var2 = C) and F (i.e. F/E+F when Var1 = A and Var2 = C)

  • When var1 = A and Var2 = D: What counts and percentage of rows are : E (i.e. E/E+F when Var1 = A and Var2 = D) and F (i.e. F/E+F when Var1 = A and Var2 = D)

  • When var1 = B and Var2 = C: What counts and percentage of rows are : E (i.e. E/E+F when Var1 = B and Var2 = C) and F (i.e. F/E+F when Var1 = B and Var2 = C)

  • When var1 = B and Var2 = D: What counts and percentage of rows are : E (i.e. E/E+F when Var1 = B and Var2 = D) and F (i.e. F/E+F when Var1 = B and Var2 = D)

I know how to calculate percentages and counts relative to all rows:

select
var1,
var2,
var3,
count(*) as count,
count(*) * 100 / sum(count(*)) over () as percentage 
from my_table
group by
var1,
var2,
var3;

But I do not know how to adapt the above code to solve my problem.

I know that I could do the calculations "manually" (i.e. make individual groups and calculate percentages on each group repeatedly):

SELECT var1,
       COUNT(*) AS count,
       COUNT(*) * 100.0 / SUM(COUNT(*)) OVER () AS percentage
FROM my_table
GROUP BY var1;


SELECT var1,
       var2,
       COUNT(*) AS count,
       COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (PARTITION BY var1) AS percentage
FROM my_table
GROUP BY var1, var2;


SELECT var1,
       var2,
       var3,
       COUNT(*) AS count,
       COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (PARTITION BY var1, var2) AS percentage
FROM my_table
GROUP BY var1, var2, var3;

But I do not know how to do this all at once and have all results in the same table.

Can someone please show me how to do this?

Thanks!

0

There are 0 best solutions below