2012-02-20 147 views
-1

好的,我一直試圖將這個概念化爲下午的一個更好的部分,但仍然無法弄清楚如何構造這個子選擇。Subselect和Max

我需要報告的數據是根據過去3個財政年度分組的特定學生專業的年齡。每個財政年度有3個學期(夏季,秋季,春季)。我需要將我的查詢分組到fiscalyear和agerange字段,然後計算不同的學生ID。

我現在有這對我的SQL語句:

Select COUNT(distinct StuID), AgeRange, FiscalYear 

from tblStatic 

where Campus like 'World%' and (enrl_act like 'REG%' or enrl_act like 'SCH%') 
    and StuMaj = 'LAWSC' and FiscalYear IN ('09/10', '10/11', '11/12') 

group by FiscalYear, AgeRange 

order by FiscalYear, AgeRange 

所以這是所有罰款和花花公子只是它不符合我的學生對fiscalyear的人數。原因在於,人們可能會在年度範圍內跨越這個財政年度,並將它們兩次加到我的計數中。

如何使用子查詢解決此重複條目?我一直努力工作的領域是我的學期領域,並使用最大值在給定學生的fiscalyear期間找到最高學期。

數據樣本:

Count AgeRange   FiscalYear 
3   1 to 19    09/10 
20   20 to 23   09/10 
60   24 to 29   09/10 
96   30 to 39   09/10 
34   40 to 49   09/10 
14   50 to 59   09/10 
3   60+     09/10 
2   1 to 19    10/11 
24   20 to 23   10/11 
73   24 to 29   10/11 
109   30 to 39   10/11 
43   40 to 49   10/11 
11   50 to 59   10/11 
2   60+     10/11 
1   1 to 19    11/12 
17   20 to 23   11/12 
75   24 to 29   11/12 
123   30 to 39   11/12 
44   40 to 49   11/12 
14   50 to 59   11/12 
2   60+     11/12 

解決方案:(剛剛得到這個工作和生產符合他們的假設是,我的員工人數)

Select COUNT(distinct S.StuID), AR.AgeRange, S.FiscalYear 
from tblStatic S 
INNER JOIN 
( Select S.StuID, MIN(AgeRange) as AgeRange 
    From tblStatic S 
    Group By S.StuID) AR on S.StuID=AR.StuID 

where Campus like 'World%' and (enrl_act like 'REG%' or 
enrl_act like 'SCH%') 
and StuMaj = 'LAWSC' and FiscalYear IN ('09/10', '10/11', '11/12') 
group by S.FiscalYear, AR.AgeRange 
order by S.FiscalYear, AR.AgeRange 
+0

您能顯示樣本數據和期望的結果嗎?而不是存儲'AgeRange'(可能會有變化),爲什麼不存儲'Birthdate'(不是)?然後,計算總是依賴於現在或特定的時間點,而不是依賴於「AgeRange」列是否已在此期間更新。 – 2012-02-20 19:17:36

+0

我無法在評論中閱讀,對不起。請編輯您的問題,並確保您可以明智地閱讀數據,並將您的樣本數據與期望的結果分開。 – 2012-02-20 19:22:10

+0

對不起,這是新的板子。我添加了我希望我的最終結果看起來像的數據樣本。 AgeRange本身已經存在於我的數據庫中,並且存儲在學生註冊的每個學期。我確實有一個出生日期字段,我搞亂了,並且確實讓我的人數統一了,但數字似乎沒有了,因爲在前兩年我必須在我的datediff表達式中執行Getdate()-1或-2 。 – user1187569 2012-02-20 19:32:35

回答

0

替換每個學生的年齡範圍內的最大值(或最低,如果你喜歡)年齡範圍那個會計年度,然後算在他們:

; 
WITH sourceData AS (
    SELECT 
    StudID, 
    MaxAgeRangeThisFiscalYear = MAX(AgeRange) OVER 
           (PARTITION BY StudID, FiscalYear), 
    FiscalYear 
    FROM tblStatic 
    WHERE Campus LIKE 'World%' 
    AND (enrl_act LIKE 'REG%' OR enrl_act LIKE 'SCH%') 
    AND StuMaj = 'LAWSC' 
    AND FiscalYear IN ('09/10', '10/11', '11/12') 
) 
SELECT 
    FiscalYear, 
    AgeRange = MaxAgeRangeThisFiscalYear, 
    Count = COUNT(DISTINCT StudID) 
FROM sourceData 
GROUP BY 
    FiscalYear, 
    MaxAgeRangeThisFiscalYear 
ORDER BY 
    FiscalYear, 
    MaxAgeRangeThisFiscalYear