Reputation: 5
I have a table that looks like this
Table: AcctPrograms
Acct ProgramOptions Date_End
100 A 2016-09-01 00:00:00.0000000
100 B 2017-01-01 00:00:00.0000000
101 B 2017-01-01 00:00:00.0000000
101 C 2018-01-01 00:00:00.0000000
101 D 2017-01-01 00:00:00.0000000
102 C 2018-01-01 00:00:00.0000000
103 F 2016-06-01 00:00:00.0000000
103 G 2015-12-14 00:00:00.0000000
...
I want to create a view vw_AcctProgramOptions that looks like this:
Acct ProgramOption1 ProgramOption2 ... ProgramOption10
100 A B
101 B C
102 C
103 F G
...
The catch is that an acct in the AcctPrograms table can have MORE than 10 options but I'm only interested in collecting the first 10 order by MaxDate(Date_End) from the AcctPrograms table.
Any help would be greatly appreciated. I've been working on this for a couple of days and can't seem to get it working.
Thanks so much in advance.
EDIT: Using MSSQL 2008
Upvotes: 0
Views: 56
Reputation: 1
--Vashi's answer with a the A a little bit lower at the query
--try the query
create table #table
(
Acct int,
ProgramOptions varchar(1),
Date_End datetime
)
insert into #table
(
Acct,
ProgramOptions,
Date_End
)
values
( 100, 'A', '2016-09-01 00:00:00' ),
( 100, 'B', '2017-01-01 00:00:00' ),
( 101, 'B', '2017-01-01 00:00:00' ),
( 101, 'C', '2018-01-01 00:00:00' ),
( 101, 'D', '2017-01-01 00:00:00' ),
( 102, 'C', '2018-01-01 00:00:00' ),
( 103, 'F', '2016-06-01 00:00:00' ),
( 103, 'G', '2015-12-14 00:00:00' )
SELECT A.ACCT,
MAX(CASE WHEN A.RNUM = 1 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION1,
MAX(CASE WHEN A.RNUM = 2 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION2,
MAX(CASE WHEN A.RNUM = 3 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION3,
MAX(CASE WHEN A.RNUM = 4 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION4,
MAX(CASE WHEN A.RNUM = 5 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION5,
MAX(CASE WHEN A.RNUM = 6 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION6,
MAX(CASE WHEN A.RNUM = 7 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION7,
MAX(CASE WHEN A.RNUM = 8 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION8,
MAX(CASE WHEN A.RNUM = 9 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION9,
MAX(CASE WHEN A.RNUM = 10 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION10
FROM
(SELECT
ACCT, PROGRAMOPTIONS, DATE_END, ROW_NUMBER() OVER (PARTITION BY ACCT ORDER BY DATE_END) AS RNUM
FROM
#table
) A
GROUP BY A.ACCT;
drop table #table
Upvotes: 0
Reputation: 1787
Use ROW_NUMBER
to order ProgramOptions
grouped by Acct
and pull the first 10 in the order in the form of columns by using CASE WHEN
statements.
SELECT A.ACCT,
MAX(CASE WHEN A.RNUM = 1 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION1,
MAX(CASE WHEN A.RNUM = 2 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION2,
MAX(CASE WHEN A.RNUM = 3 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION3,
MAX(CASE WHEN A.RNUM = 4 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION4,
MAX(CASE WHEN A.RNUM = 5 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION5,
MAX(CASE WHEN A.RNUM = 6 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION6,
MAX(CASE WHEN A.RNUM = 7 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION7,
MAX(CASE WHEN A.RNUM = 8 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION8,
MAX(CASE WHEN A.RNUM = 9 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION9,
MAX(CASE WHEN A.RNUM = 10 THEN A.PROGRAMOPTIONS ELSE NULL END) AS PROGRAMOPTION10
FROM
(SELECT
ACCT, PROGRAMOPTIONS, DATE_END, ROW_NUMBER() OVER (PARTITION BY ACCT ORDER BY DATE_END) AS RNUM
FROM
ACCTPROGRAMS A
)
GROUP BY A.ACCT;
Upvotes: 1