Yesterday One of my friend give me to solve one interesting query. There are some specific forms list in one table. There is one more table for month. The status of form as per month recorded in another table. Base on status table, we have to find for which month status record not fill up for forms.
Table Name Field Name
Forms form_id
form_name
Months Month_id
Month_Name
Status form_id
month_id
status (whether filled or not)
comment (Comment for each entry)
Sample Data As per Bellow:
Table Name Field Name
Forms form_id
form_name
Months Month_id
Month_Name
Status form_id
month_id
status (whether filled or not)
comment (Comment for each entry)
Sample Data As per Bellow:
Required Result
I found one solution for this. The code of query as per bellow.
create table Forms(formId int, formName varchar(20))
create table Months(MonthId int,[Month] varchar(20))
create table StatusTable(FormId int,MonthId int,Status varchar(10),
Comment varchar(10))
insert into Forms
Select 1,'Form1' union all
Select 2,'Form2' union all
Select 3,'Form3'
insert into Months
Select 1,'Jan-11' union all
Select 2,'Feb-11' union all
Select 3,'Mar-11' union all
Select 4,'Apr-11' union all
Select 5,'May-11'
insert into StatusTable
select 1,1,'Yes','Good' union all
select 1,2,'Yes','Bad' union all
select 1,3,'Yes','Excellent' union all
select 2,2,'Yes','Good' union all
select 2,3,'Yes','Bad' union all
select 2,4,'Yes','Excellent' union all
select 3,3,'Yes','Bad' union all
select 3,4,'Yes','Excellent' union all
select 3,5,'Yes','BAD'
declare @query varchar(MAX)
declare @query2 varchar(MAX)
declare @query3 varchar(MAX)
select @query2 = COALESCE(@query2 + ', ','') + QUOTENAME(MONTH) from MONTHS
select @query3 = COALESCE(@query3 + ', ','') + QUOTENAME(MONTH)+' AS '
+QUOTENAME(MONTH) from MONTHS
set @query=';With CTE as
(select F.FORMID,F.FORMNAME,M.MONTH,ISNULL(S.STATUS,''NO'') as STATUS
from FORMS F
cross join MONTHS M
left join StatusTable S on F.FORMID=S.FORMID and M.MONTHID=S.MONTHID)
select FORMNAME,'+@query3+' from cte
PIVOT (max(STATUS) for MONTH IN ('+@query2+')) pvt'
exec(@query)
drop table Forms
drop table Months
drop table StatusTable
I hope this may be you also. If anybody has better query than above query, I am waiting for it.

No comments:
Post a Comment