2016-07-29 16 views
0

ピボットを使用して年齢列の年齢範囲をグループ化し、すべての列が必要なだけ満たされていません。私はLOS(滞在期間)と年齢の合計を取っています。合計はTotalLOSと等しいはずですが、現時点ではそうではありません。助けてください!!年齢範囲にピボットを使用する問題

これは、T-SQLクエリです:私はAccessからこのクエリを変換しています

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 

。これはアクセスクエリです。

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を変更する場合は、あなたの実際の問題が何であるかわからない

+0

[Hosp County]、Hosp、LOSによってこれらのフィールドをグループに含めることはできません[aggregating](https://msdn.microsoft.com/en-GB/library/ms173454.aspx) select句で指定します。間違った結果を返すサンプルデータを提供できますか?それがなければ、あなたの質問に取り組むのは難しいです。 –

答えて

0

が、それは良い仕事かもしれません:

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に変換するときに必要なピボットがあるため、これを想定していました。私はあなたの助けに感謝します! –

関連する問題