2016-11-20 47 views
0

我有这样的查询,返回1行集合款项 DECLARE @ Income9诠释逆透视一个聚集的行1列

SELECT @Income9 = IncomeLevel FROM PovertyLevels WHERE HouseholdNumber = 9 
;WITH CTE 
AS 
(
SELECT PatientProfileID, CASE WHEN v.FamilyMembersinHousehold > 8 
       THEN ROUND((CAST(AnnualIncome as float)/(CAST(@Income9 as float) +((V.FamilyMembersinHousehold-8)* CAST(@Income9 as Float)))*100.00), 5) 
      WHEN ((v.FamilyMembersinHousehold IS NULL) OR (AnnualIncome IS NULL)) THEN NULL 
      ELSE ROUND(((CAST(AnnualIncome AS Float)/CAST(pl.IncomeLevel as Float)) * 100.00), 5) END AS PercentOfPoverty 
FROM vPatientDemographics v 
    LEFT OUTER JOIN PovertyLevels pl ON v.FamilyMembersinHousehold = pl.HouseholdNumber 
) 
SELECT SUM(CASE WHEN PercentOfPoverty <= 100 THEN 1 ELSE 0 END) AS NumOfPatientsBelow100, 
     SUM(CASE WHEN PercentOfPoverty BETWEEN 101 AND 150 THEN 1 ELSE 0 END) AS NumOfPatientsBetween101And150, 
     SUM(CASE WHEN PercentOfPoverty BETWEEN 151 AND 200 THEN 1 ELSE 0 END) AS NumOfPatientsBetween151And200, 
     SUM(CASE WHEN PercentOfPoverty > 200 THEN 1 ELSE 0 END) AS NumOfPatientsOver200, 
     SUM(CASE WHEN PercentOfPoverty IS NULL THEN 1 ELSE 0 END) AS NumOfPatientsUnknown 
FROM CTE 

我想有总和数据是在没有行列。 我试着添加这个UNPIVOT但它不能识别列名。

UNPIVOT 
(
    Levels for PovertyLevels in (NumOfPatientsBelow100, NumOfPatientsBetween101And150, NumOfPatientsBetween151And200, 
     NumOfPatientsOver200, NumOfPatientsUnknown) 
) as Unpvt 

我该如何将初始数据集重新设置为它在行中不是列?

回答

1

这是因为Where子句前select

SELECT @Income9 = IncomeLevel FROM PovertyLevels WHERE HouseholdNumber = 9 
;WITH CTE 
AS 
(
SELECT PatientProfileID, CASE WHEN v.FamilyMembersinHousehold > 8 
       THEN ROUND((CAST(AnnualIncome as float)/(CAST(@Income9 as float) +((V.FamilyMembersinHousehold-8)* CAST(@Income9 as Float)))*100.00), 5) 
      WHEN ((v.FamilyMembersinHousehold IS NULL) OR (AnnualIncome IS NULL)) THEN NULL 
      ELSE ROUND(((CAST(AnnualIncome AS Float)/CAST(pl.IncomeLevel as Float)) * 100.00), 5) END AS PercentOfPoverty 
FROM vPatientDemographics v 
    LEFT OUTER JOIN PovertyLevels pl ON v.FamilyMembersinHousehold = pl.HouseholdNumber 
),intr as 
(
SELECT SUM(CASE WHEN PercentOfPoverty <= 100 THEN 1 ELSE 0 END) AS NumOfPatientsBelow100, 
     SUM(CASE WHEN PercentOfPoverty BETWEEN 101 AND 150 THEN 1 ELSE 0 END) AS NumOfPatientsBetween101And150, 
     SUM(CASE WHEN PercentOfPoverty BETWEEN 151 AND 200 THEN 1 ELSE 0 END) AS NumOfPatientsBetween151And200, 
     SUM(CASE WHEN PercentOfPoverty > 200 THEN 1 ELSE 0 END) AS NumOfPatientsOver200, 
     SUM(CASE WHEN PercentOfPoverty IS NULL THEN 1 ELSE 0 END) AS NumOfPatientsUnknown 
FROM CTE 
) 
Select cnt,range from intr 
cross apply (values (NumOfPatientsBelow100,'NumOfPatientsBelow100'), 
(NumOfPatientsBetween101And150,'NumOfPatientsBetween101And150'), 
(NumOfPatientsBetween151And200,'NumOfPatientsBetween151And200'), 
(NumOfPatientsOver200,'NumOfPatientsOver200'), 
(NumOfPatientsUnknown,'NumOfPatientsUnknown')) cs (cnt,range) 
+0

这一工程进行评估。但我从来没有见过这样的建筑。你创建了2个CTE,然后交叉应用它们? –