2016-07-29 64 views
0

我正在使用枢轴将年龄段的年龄范围分组,并且所有列都没有按照他们应该填充的方式填充。我将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"); 

这是一个示例访问数据之前的数据透视。它没有所有的列。

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 

而且一旦进入查询运行时,它把它变成这样:

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。

+0

当[聚合](https://msdn.microsoft.com/en-GB/library/ms173454.aspx)在[Hosp County],Hosp,LOS'组中包含这些字段没有意义在select子句中。你能否提供返回不正确结果的样本数据?没有它很难处理你的查询。 –

回答

0

不知道你的实际问题是什么,但如果你改变了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 

编辑:删除了年龄,这是没有意义的一列。

+0

AHHHHH !!!谢谢JamesZ。我根本不需要支点。我假设,因为Access查询有一个数据透视表,我将其转换为T-SQL时需要一个数据透视表。我感谢您的帮助! –