【问题标题】:Using Pivot for Age Ranges Issue使用 Pivot 解决年龄范围问题
【发布时间】:2016-12-04 09:28:18
【问题描述】:

我正在使用数据透视来对年龄列中的年龄范围进行分组,并且所有列都没有按应有的方式填充。我正在计算 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。

【问题讨论】:

  • [Hosp County], Hosp, LOS 将这些字段包含在组中是没有意义的,而 aggregating 将它们包含在 select 子句中。您能否提供返回错误结果的样本数据?没有它就很难处理您的查询。

标签: sql sql-server tsql pivot pivot-table


【解决方案1】:

不确定您的实际问题是什么,但如果您将 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

编辑:删除年龄,作为一个列没有意义。

【讨论】:

  • 啊啊啊啊!!!谢谢詹姆斯Z。我根本不需要支点。我假设是因为 Access 查询有一个支点,在将其转换为 T-SQL 时我需要一个支点。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2015-04-14
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
相关资源
最近更新 更多