I am using MS Sql2008,
Table1: Plan.Plan
Table2: Plan.PlanFeature
Table3:Plan.PlanDetails
Plan.Plan
PlanID_PK PlanName AnnualPrice MonthlyPrice
1 Plan1 Free Free
2 Plan2 $50.00 $4.99
3 Plan3 $100.00 $9.99
Plan.PlanFeature
PlanFeatureID_PK FeatureName
- - - - - - - - - - - - - - - - - - - - - - - - - - -
1 Feature1
2 Feature2
3 Feature3
4 Feature4
Plan.PlanDetails
PlanDetailsID_PK PlanID_FK PlanFeatureID_FK Quantity Quantity_Type
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - -
1 1 1 0 Included
2 1 2 0 Unlimited
3 1 3 2 None
4 1 4 0 Unlimited
5 2 1 0 Included
6 2 2 0 Unlimited
7 2 3 20 None
8 2 4 0 Unlimited
9 3 1 0 Included
10 3 2 0 Unlimited
11 3 3 >20 None
12 3 4 0 Unlimited
Output :
FeatureName Plan1 Plan2 Plan3
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Feature1 Included Included Included
Feature2 Unlimited Unlimited Unlimited
Feature3 2 20 >20
Feature4 Unlimited Unlimited Unlimited
AnnualPrice Free $50.00 $100.00
MonthlyPrice Free $4.99 $9.99
So here we go, For converting rows into columns I used COALESCE and Pivot
Here the stored procedure I am trying it,
DECLARE @cols NVARCHAR(2000)
DECLARE @SubjectQuery NVARCHAR(MAX)
SELECT @cols = COALESCE(@cols + ',[' + PlanNames + ']',
'[' + PlanNames + ']')
FROM Plans.Plans
ORDER BY PlanNames
SET @SubjectQuery = 'SELECT FeatureName, ' + @cols + '
FROM
(select p.PlanId_PK, p.PlanNames,pf.FeatureName,pd.Quantity from Plans.PlanDetails pd
join Plans.Plans p on pd.PlanId_FK=p.PlanId_PK
join Plans.PlanFeatures pf on pd.PlanFeatureId_FK=pf.PlanFeatureId_PK ) S
PIVOT
(
Count(Quantity) --Dont know which aggregate functions i have to use here according to my output
FOR PlanNames IN
(' + @cols + ')) AS pvt'
exec @SubjectQuery
For quantity I have to check condition like this MAX(CASE WHEN pd.Quantity = '0' THEN pd.Quantity_Type)as Quantity, if the quantity value is 0 then i have to display Quantity_type values
Inside the pivot block don’t know which aggregate function i have to use according to my output, can you please figure this out?
Based on your sample data and the desire output, I think you will want to use the
caseinside of the subquery, before thepivot:See SQL Fiddle with Demo.
The result is:
Edit, If you need the annual price and monthly price, then you will need to incorporate an
unpivotand thepivotfunction:See SQL Fiddle with Demo
Result: