The database that I am retrieving data from has the table structure like this
我正在从中检索数据的数据库具有这样的表结构
Table: ClientSales
ClientSalesId int identity (1, 1) (PK)
ClientId int (FK)
TermId int (FK)
StudentType1Population int
StudentType1Adjustment int
StudentType1Sales int
StudentType1SalesAdjustment int
StudentType2Population int
StudentType2Adjustment int
StudentType2Sales int
StudentType2SalesAdjustment int
StudentType3Population int
StudentType3Adjustment int
StudentType3Sales int
StudentType3SalesAdjustment int
StudentType4Population int
StudentType4Adjustment int
StudentType4Sales int
StudentType4SalesAdjustment int
StudentType5Population int
StudentType5Adjustment int
StudentType5Sales int
StudentType5SalesAdjustment int
I have to display it unpivoted in a report as follows
我必须在报告中显示它如下所示
For ClientId = 1 and Term Id = 1
对于ClientId = 1和Term Id = 1
Population PopulationAdjustment Sales SalesAdjustment StudentType1 313 18 123 22 StudentType2 233 14 156 33 StudentType3 234 12 112 41 StudentType4 233 13 198 29 StudentType5 343 10 134 36
I can do this two ways
我可以用两种方式做到这一点
SELECT
'StudentType1' as DemographicType
StudentType1Population as Population,
StudentType1Adjustment as PopulationAdjustment,
StudentType1Sales as Sales,
StudentType1SalesAdjustment as SalesAdjustment,
FROM ClientSales
WHERE 1=1
AND ClientId = 1
AND TermId = 1
UNION
SELECT
'StudentType2' as DemographicType
StudentType2Population as Population,
StudentType2Adjustment as PopulationAdjustment,
StudentType2Sales as Sales,
StudentType2SalesAdjustment as SalesAdjustment,
FROM ClientSales
WHERE 1=1
AND ClientId = 1
AND TermId = 1
-- yada yada yada for the rest of the types...........
OR
SELECT
ClientId,
Population
FROM
(
SELECT
ClientId,
StudentType1Population,
StudentType2Population,
StudentType3Population,
StudentType4Population,
StudentType5Population
FROM ClientSales
) PVTPopulation
UNPIVOT
(
Population for StudentType IN
(
StudentType1Population,
StudentType2Population,
StudentType3Population,
StudentType4Population,
StudentType5Population
)
) as UnPvtPopulation
INNER JOIN
(
SELECT
ClientId,
StudentType1PopulationAdjustment,
StudentType2PopulationAdjustment,
StudentType3PopulationAdjustment,
StudentType4PopulationAdjustment,
StudentType5PopulationAdjustment
FROM ClientSales
) PVTPopulation
UNPIVOT
(
PopulationAdjustment for StudentType IN
(
StudentType1PopulationAdjustment,
StudentType2PopulationAdjustment,
StudentType3PopulationAdjustment,
StudentType4PopulationAdjustment,
StudentType5PopulationAdjustment
)
) as UnPvtPopulationAdjustment
ON UnPvtPopulationAdjustment.ClientSalesId = UnPvtPopulation.ClientSalesId
AND REPLACE (UnPvtPopulationAdjustment.StudentType, 'PopulationAdjustment', '') = REPLACE (UnPvtPopulation.StudentType, 'Population', '')
INNER JOIN
(
SELECT
ClientId,
StudentType1Sales,
StudentType2Sales,
StudentType3Sales,
StudentType4Sales,
StudentType5Sales
FROM ClientSales
) PVTSales
UNPIVOT
(
Sales for StudentType IN
(
StudentType1Sales,
StudentType2Sales,
StudentType3Sales,
StudentType4Sales,
StudentType5Sales
)
) as UnPvtSales
ON UnPvtSales.ClientSalesId = UnPvtPopulation.ClientSalesId
AND REPLACE (UnPvtSales.StudentType, 'Sales', '') = REPLACE (UnPvtPopulation.StudentType, 'Population', '')
So here are the questions:
所以这里是问题:
- As a best practice, should I use UNPIVOT or UNION
- Is there a better way to write this UNPIVOT?
作为最佳实践,我应该使用UNPIVOT还是UNION
有没有更好的方法来写这个UNPIVOT?
1 个解决方案
#1
I found out that an UNPIVOT is just like a where clause.. you can use as many as you need
我发现UNPIVOT就像where子句......你可以根据需要使用它
SELECT Col1, Col2, Unp1, Unp2, Unp3
FROM TBL
UNPIVOT (XX For Unp1 (ColXX1, ColXX2))
UNPIVOT (YY For Unp2 (ColYY1, ColYY2))
UNPIVOT (ZZ For Unp2 (ColZZ1, ColZZ2))
#1
I found out that an UNPIVOT is just like a where clause.. you can use as many as you need
我发现UNPIVOT就像where子句......你可以根据需要使用它
SELECT Col1, Col2, Unp1, Unp2, Unp3
FROM TBL
UNPIVOT (XX For Unp1 (ColXX1, ColXX2))
UNPIVOT (YY For Unp2 (ColYY1, ColYY2))
UNPIVOT (ZZ For Unp2 (ColZZ1, ColZZ2))