2016-11-20 1 views
0

Ich habe diese Abfrage, die 1 Reihe von aggregierten Summen gibt @ Income9Entpivotisierung eine Reihe von Aggregaten auf 1 Spalte

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 

int ERKLÄREN würde Ich mag die Summendaten haben, die in Zeilen nicht Spalten zu sein. Ich habe versucht, diese UNPIVOT hinzufügen, aber es erkennt die Spaltennamen nicht.

Wie kann ich den ersten Datensatz deaktivieren, dass es in Zeilen nicht Spalten ist?

Antwort

1

Es ist, weil Where Klausel vor dem select ausgewertet

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

, das funktioniert. Aber ich habe diese Konstruktion nie gesehen. Sie haben 2 CTEs angelegt und diese dann gekreuzt angewendet? –

Verwandte Themen