2016-11-20 21 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,然後交叉應用它們? –