I have a query that returns results that look like the create table query below
create table #testresults
(
pat_id int,
fill_date date,
script_end_date date,
drug_class char(3),
distinctDrugs int
)
There are seven different categories of drugs that a pat_id can be given. The distinctDrugs column is the number of different drugs that a pat_id can be given within the time frame of fill_date and script_end_date. The results of running the query look like:

Each pat_id has many different fill_date and script_end_date time periods. These different time periods have a different drug_class and distinctDrugs per row. The right two columns on this example are indicative of what I need: I need on each row, for each fill_date and script_end_date the drug_class anddistinctDrugs for each drug_class. I used this query to add the two right-most columns to my base view
select distinct
t.pat_id
,t.fill_date
,t.script_end_date
,t.drug_class
,t.distinctDrugs
,h3a.drug_class as h3aDrugClass
,h3a.distinctDrugs
from #temp as t
left join
(
select
pat_id
,fill_date
,script_end_date
,drug_class
,distinctDrugs
from #temp
where drug_class='h3a'
) as h3a on h3a.pat_id=t.pat_id and h3a.fill_date between t.fill_date and t.script_end_date and t.drug_class !=h3a.drug_class
where h3a.drug_class is not null
It would be easy enough to do this for the rest of the drug_class columns, but this isn’t remotely efficient. Is there a way to do this much more simply using recursion (or any other manner for that matter)?
EDIT:
Here is the final product of what I was looking for:
select distinct
f.pat_id
,f.fill_date
,f.script_end_date
,case when h3a.drug_class is null then 'H3A' else 'H3A' end as H3A
,isnull(h3a.distinctDrugs,0) as h3aCounts
,case when h4b.drug_class is null then 'H4B' else 'H4B' end as H4B
,isnull(h4b.distinctDrugs,0) as h4bCounts
,case when h6h.drug_class is null then 'H6H' else 'H6H' end as H6H
,isnull(h6h.distinctDrugs,0) as h6hCounts
,case when h2s.drug_class is null then 'H2S' else 'H2S' end as H2S
,isnull(h2s.distinctDrugs,0) as h2sCounts
,case when h2e.drug_class is null then 'H2E' else 'H2E' end as H2E
,isnull(h2e.distinctDrugs,0) as h2eCounts
,case when h2f.drug_class is null then 'H2F' else 'H2F' end as H2F
,isnull(h2f.distinctDrugs,0) as h2fCounts
,case when j7c.drug_class is null then 'J7C' else 'J7C' end as J7C
,isnull(j7c.distinctDrugs,0) as j7cCounts
from familyStrata as f
left join
(
select
pat_id
,drug_class
,distinctDrugs
,fill_date
from familyStrata
where drug_class='h3a'
) as h3a on h3a.pat_id=f.pat_id and h3a.fill_date between f.fill_date and f.script_end_date
left join
(
select
pat_id
,drug_class
,fill_date
,distinctDrugs
from familyStrata
where drug_class='h4b'
) as h4b on h4b.pat_id=f.pat_id and h4b.fill_date between f.fill_date and f.script_end_date
left join
(
select
pat_id
,drug_class
,fill_date
,distinctDrugs
from familyStrata
where drug_class='h6h'
) as h6h on h6h.pat_id=f.pat_id and h6h.fill_date between f.fill_date and f.script_end_date
left join
(
select
pat_id
,drug_class
,fill_date
,distinctDrugs
from familyStrata
where drug_class='h2f'
) as h2f on h2f.pat_id=f.pat_id and h2f.fill_date between f.fill_date and f.script_end_date
left join
(
select
pat_id
,drug_class
,fill_date
,distinctDrugs
from familyStrata
where drug_class='h2s'
) as h2s on h2s.pat_id=f.pat_id and h2s.fill_date between f.fill_date and f.script_end_date
left join
(
select
pat_id
,drug_class
,fill_date
,distinctDrugs
from familyStrata
where drug_class='h2e'
) as h2e on h2e.pat_id=f.pat_id and h2e.fill_date between f.fill_date and f.script_end_date
left join
(
select
pat_id
,drug_class
,fill_date
,distinctDrugs
from familyStrata
where drug_class='j7c'
) as j7c on j7c.pat_id=f.pat_id and j7c.fill_date between f.fill_date and f.script_end_date
This is actually rather fast, but is in no way remotely elegeant/extensible. Here is what the result set should look like:

You can see the number the drug_class and the distinctDrugs for each different drug, for each time period. Now, is there a much more elegant solution to this problem than this?
So, recursion isn’t the best method for doing this. I settled with