使用 Pivot 解决年龄范围问题
Using Pivot for Age Ranges Issue
我正在使用数据透视表对年龄列中的年龄范围进行分组,但所有列都没有按应有的方式填充。我正在计算 LOS(逗留时间)和年龄范围总数的总和应该等于 TotalLOS,但目前不是。请帮忙!!
这是 T-SQL 查询:
SELECT *
FROM
(
SELECT [Hosp Name],
Cnty,
Max([Hosp County]) as [FirstOfHosp_County],
Max(Hosp) as UID,
LOS,
Age,
Sum(LOS) as TotalLOS,
CASE
WHEN Age <=17 THEN '0-17'
WHEN Age Between 18 and 64 THEN '18-64'
WHEN Age >=65 THEN '65 Up'
ELSE NULL
END AS AGERANGE
FROM [S1: Basic Source Query]
GROUP BY [Hosp Name], Cnty, Age, [Hosp County], Hosp, LOS
) AS S
PIVOT
(
Sum(S.LOS)
for S.AGERANGE
in ([0-17], [18-64],[65 Up])
) as pvt
我正在从 Access 转换此查询。这是访问查询:
TRANSFORM Sum([S1: Basic Source Query].LOS) AS Days
SELECT [S1: Basic Source Query].[Hosp Name],
[S1: Basic Source Query].Cnty,
FirstOfHosp County: First([S1: Basic Source Query].[Hosp County])
UID: First([S1: Basic Source Query].Hosp)
Total: Sum([S1: Basic Source Query].LOS)
FROM [S1: Basic Source Query]
GROUP BY [S1: Basic Source Query].[Hosp Name],
[S1: Basic Source Query].Cnty
PIVOT Switch([Age] Between 0 And 17,"0-17",[Age] Between 18 And 64,"18-64",[Age]>=65,"65 Up");
这是透视前的 Access 数据示例。它没有所有的列。
Hosp Hosp Name LOS Age
HOSP301 Apple Hospital 16 92
HOSP301 Apple Hospital 5 34
HOSP301 Apple Hospital 14 85
HOSP301 Apple Hospital 7 21
HOSP301 Apple Hospital 4 79
HOSP301 Apple Hospital 2 26
HOSP301 Apple Hospital 2 19
一旦 Access 查询运行,它就会变成这样:
UID Hosp Name TotalLOS 0-17 18-64 65 Up
HOSP301 Apple Hospital 130 117 13
HOSP301 Apple Hospital 5 5
HOSP301 Apple Hospital 722 60 455 207
HOSP301 Apple Hospital 23 17 6
HOSP301 Apple Hospital 15 15
HOSP301 Apple Hospital 6 6
HOSP301 Apple Hospital 3 3
HOSP301 Apple Hospital 32 1 31
这是我得到的 SQL 错误结果。年龄范围下的数字应与 TotalLOS 列匹配:
UID Hosp Name Cnty FirstOfHosp_County Age TotalLOS 0-17 18-64 65 Up
HOSP301 Apple Hospital Apple Apple 57 24 4
HOSP301 Apple Hospital Apple Apple 68 13 13
HOSP301 Apple Hospital Apple Apple 69 12 4
HOSP301 Apple Hospital Apple Apple 71 10 10
HOSP301 Apple Hospital Apple Apple 73 8 2
HOSP301 Apple Hospital Apple Apple 74 7 7
HOSP301 Apple Hospital Apple Apple 75 6 6
HOSP301 Apple Hospital Apple Apple 79 34 17
HOSP301 Apple Hospital Bacon Apple 63 2 2
HOSP301 Apple Hospital Bagwin Apple 68 16 16
因此,如您所见,范围内的数字并不总是与 TotalLOS 列中的数字相匹配。我相信我没有将它从 Access 正确转换为 T-SQL.
不确定您的实际问题是什么,但如果您将 SQL 更改为类似这样的内容,它可能会更好:
SELECT [Hosp Name],
Cnty,
Max([Hosp County]) as [FirstOfHosp_County],
Max(Hosp) as UID,
LOS,
Sum(LOS) as TotalLOS,
Sum(CASE WHEN Age <=17 THEN LOS else 0 end) as [0-17],
Sum(CASE WHEN Age Between 18 and 64 THEN LOS else 0 end) as [18-64],
Sum(CASE WHEN Age >=65 THEN LOS else 0 end) as [65 Up]
FROM [S1: Basic Source Query]
GROUP BY [Hosp Name], Cnty, [Hosp County], Hosp, LOS
编辑:删除年龄,作为一列没有意义。
我正在使用数据透视表对年龄列中的年龄范围进行分组,但所有列都没有按应有的方式填充。我正在计算 LOS(逗留时间)和年龄范围总数的总和应该等于 TotalLOS,但目前不是。请帮忙!!
这是 T-SQL 查询:
SELECT *
FROM
(
SELECT [Hosp Name],
Cnty,
Max([Hosp County]) as [FirstOfHosp_County],
Max(Hosp) as UID,
LOS,
Age,
Sum(LOS) as TotalLOS,
CASE
WHEN Age <=17 THEN '0-17'
WHEN Age Between 18 and 64 THEN '18-64'
WHEN Age >=65 THEN '65 Up'
ELSE NULL
END AS AGERANGE
FROM [S1: Basic Source Query]
GROUP BY [Hosp Name], Cnty, Age, [Hosp County], Hosp, LOS
) AS S
PIVOT
(
Sum(S.LOS)
for S.AGERANGE
in ([0-17], [18-64],[65 Up])
) as pvt
我正在从 Access 转换此查询。这是访问查询:
TRANSFORM Sum([S1: Basic Source Query].LOS) AS Days
SELECT [S1: Basic Source Query].[Hosp Name],
[S1: Basic Source Query].Cnty,
FirstOfHosp County: First([S1: Basic Source Query].[Hosp County])
UID: First([S1: Basic Source Query].Hosp)
Total: Sum([S1: Basic Source Query].LOS)
FROM [S1: Basic Source Query]
GROUP BY [S1: Basic Source Query].[Hosp Name],
[S1: Basic Source Query].Cnty
PIVOT Switch([Age] Between 0 And 17,"0-17",[Age] Between 18 And 64,"18-64",[Age]>=65,"65 Up");
这是透视前的 Access 数据示例。它没有所有的列。
Hosp Hosp Name LOS Age
HOSP301 Apple Hospital 16 92
HOSP301 Apple Hospital 5 34
HOSP301 Apple Hospital 14 85
HOSP301 Apple Hospital 7 21
HOSP301 Apple Hospital 4 79
HOSP301 Apple Hospital 2 26
HOSP301 Apple Hospital 2 19
一旦 Access 查询运行,它就会变成这样:
UID Hosp Name TotalLOS 0-17 18-64 65 Up
HOSP301 Apple Hospital 130 117 13
HOSP301 Apple Hospital 5 5
HOSP301 Apple Hospital 722 60 455 207
HOSP301 Apple Hospital 23 17 6
HOSP301 Apple Hospital 15 15
HOSP301 Apple Hospital 6 6
HOSP301 Apple Hospital 3 3
HOSP301 Apple Hospital 32 1 31
这是我得到的 SQL 错误结果。年龄范围下的数字应与 TotalLOS 列匹配:
UID Hosp Name Cnty FirstOfHosp_County Age TotalLOS 0-17 18-64 65 Up
HOSP301 Apple Hospital Apple Apple 57 24 4
HOSP301 Apple Hospital Apple Apple 68 13 13
HOSP301 Apple Hospital Apple Apple 69 12 4
HOSP301 Apple Hospital Apple Apple 71 10 10
HOSP301 Apple Hospital Apple Apple 73 8 2
HOSP301 Apple Hospital Apple Apple 74 7 7
HOSP301 Apple Hospital Apple Apple 75 6 6
HOSP301 Apple Hospital Apple Apple 79 34 17
HOSP301 Apple Hospital Bacon Apple 63 2 2
HOSP301 Apple Hospital Bagwin Apple 68 16 16
因此,如您所见,范围内的数字并不总是与 TotalLOS 列中的数字相匹配。我相信我没有将它从 Access 正确转换为 T-SQL.
不确定您的实际问题是什么,但如果您将 SQL 更改为类似这样的内容,它可能会更好:
SELECT [Hosp Name],
Cnty,
Max([Hosp County]) as [FirstOfHosp_County],
Max(Hosp) as UID,
LOS,
Sum(LOS) as TotalLOS,
Sum(CASE WHEN Age <=17 THEN LOS else 0 end) as [0-17],
Sum(CASE WHEN Age Between 18 and 64 THEN LOS else 0 end) as [18-64],
Sum(CASE WHEN Age >=65 THEN LOS else 0 end) as [65 Up]
FROM [S1: Basic Source Query]
GROUP BY [Hosp Name], Cnty, [Hosp County], Hosp, LOS
编辑:删除年龄,作为一列没有意义。