I need help with grouping and dynamic number of queried fields

Unanswered I need help with grouping and dynamic number of queried fields

  • Tuesday, February 05, 2013 5:03 PM
     
      Has Code

    Hi,

    I am trying to put together a report with totals from employees selected benefits per bill. The challenge is that the totals on the report are per bill but,  the columns with taxes must be split by states. The number of states can be one or few depending on a bill.

    I have 2 servers, one is SQL2005 and another 2008.

    Thank you in advance, Gena

    Here is the current result:

    coverage               premium                adjustment             tax
    ---------------------- ---------------------- ---------------------- ----------------------
    7000                   192.5                  -12                    23.12

    Here is what I need it to look:

    coverage               premium                adjustment             tax       NY      NJ      WI     CA
    ---------------------- ---------------------- ---------------------- --------- ------- ------- ------ ------
    7000                   192.5                  -12                    23.12     0.56    0.29    0.24   22.03

    Tables and data:

    create table #employees (employee_id int, state_id char(2))
    create table #empbenefits (employee_id int, bill_id int, benefit_id int, coverage float, premium float, adjustment float, tax float)
    set nocount on
    
    insert into #employees (employee_id, state_id) values (12, 'NY')
    insert into #employees (employee_id, state_id) values (14, 'NY')
    insert into #employees (employee_id, state_id) values (15, 'NJ')
    insert into #employees (employee_id, state_id) values (16, 'WI')
    insert into #employees (employee_id, state_id) values (18, 'CA')
    insert into #employees (employee_id, state_id) values (19, 'CA')
    insert into #employees (employee_id, state_id) values (20, 'CA')
    insert into #employees (employee_id, state_id) values (21, 'CA')
    
    -- bill id 1
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 12, 21, 500, 10, -2, 0.12)
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 12, 25, 100, 12, 0, 0.10)
    
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 14, 21, 400, 10, -2, 0.12)
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 14, 25, 200, 14, 0, 0.22)
    
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 15, 21, 500, 10, -2, 0.12)
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 15, 25, 700, 18, 10, 0.17)
    
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 16, 21, 500, 10, -2, 0.12)
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 16, 25, 500, 10, -2, 0.12)
    
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 18, 21, 500, 10, 0, 1.12)
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 18, 25, 400, 20, 0, 2.12)
    
    
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 19, 21, 500, 10, 0, 2.15)
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 19, 25, 900, 30, 0, 1.1)
    
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 20, 21, 500, 10, 0, 2.1)
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 20, 25, 100, 5, 0, 4.2)
    
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 21, 21, 500, 8.5, -10, 8.12)
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (1, 21, 25, 200, 5, -2, 1.12)
    
    -- another bill id 3, i will not query it, just for illustration
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (3, 12, 21, 500, 10, -2, 0.12)
    insert into #empbenefits (bill_id, employee_id, benefit_id, coverage, premium, adjustment, tax) values (3, 12, 25, 500, 10, -2, 0.12)
    
    set nocount off
    select state_id,
    SUM(coverage) as coverage,
    SUM(premium) as premium,
    SUM(adjustment) as adjustment,
    SUM(tax) as tax
    from #empbenefits b
    join #employees e on e.employee_id = b.employee_id 
    where bill_id = 1
    --group by state_id
    
    drop table #employees, #empbenefits



    • Edited by gena_q Tuesday, February 05, 2013 5:06 PM
    •  

All Replies

  • Tuesday, February 05, 2013 5:17 PM
    Moderator
     
      Has Code

    Simply do conditional SUM if number of states is limited, e.g.

    set nocount off
    select state_id,
    SUM(coverage) as coverage,
    SUM(premium) as premium,
    SUM(adjustment) as adjustment,
    SUM(case when state_id = 'NY' then tax else 0) as [NY],
    SUM(case when state_id = 'NJ' then tax else 0) as [NJ], etc.
    from #empbenefits b
    join #employees e on e.employee_id = b.employee_id 
    where bill_id = 1


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

  • Tuesday, February 05, 2013 5:22 PM
     
      Has Code

    You can try something like below. However, you may need to write dynamic SQL to build list of countries for PIVOT, if the current shown list of countries is not always the same.

    SELECT	Totals.*, StateWiseTax. *
    FROM		(
    				select	
    				SUM(coverage) as coverage,
    				SUM(premium) as premium,
    				SUM(adjustment) as adjustment
    				from #empbenefits b
    				join #employees e on e.employee_id = b.employee_id 
    				where bill_id = 1
    			) Totals
    CROSS JOIN	(
    				SELECT		*
    				FROM	(
    							select state_id,
    							SUM(tax) as tax
    							from #empbenefits b
    							join #employees e on e.employee_id = b.employee_id 
    							where bill_id = 1
    							group by state_id
    						) Temp
    				PIVOT	(
    							SUM(tax)
    						FOR	state_id IN ([CA], [NJ], [NY], [WI])
    						) P
    			) StateWiseTax
    Thanks!
  • Tuesday, February 05, 2013 6:23 PM
     
     
    The challenge is that the number of states in the bill is not fixed. One bill can have NY, CA and NJ and, another only CA. I just need to display those that are in current bill.
  • Tuesday, February 05, 2013 6:43 PM
    Moderator
     
     
    The table can not have variable number of columns, so you may want to include them all and in the report display them only when not NULL.

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog