0

**注: もう少し進んで、NULLIF(0 または 5) を追加する必要があります。ここに私の答えについて短い投稿を書きました: http://peterkellner.net/2013/10/13/creating-a-compound-nullif-in-avg-function-with-sqlserver/ しかし、私の解決策には満足していません)

出席者がコースへの推定出席を入力する結果の表があります。彼らが 0 を入力するか空のままにした場合、それを無視して、入力された値の平均を取得します。SQL 全体の where 句がないと、その制約を AVG 関数に追加する方法がわかりません。それは可能ですか?私のコードは次のようになります: (EstimatedNumberAttendees は私が求めているものです)。

SELECT dbo.SessionEvals.SessionId,
   AVG(Cast (dbo.SessionEvals.CourseAsWhole as Float)) AS CourseAsWholeAvg,
   COUNT(*),
   COUNT(case
           when dbo.SessionEvals.InstructorPromptness = 'On Time' then 1
           else null
         end) AS SpeakerOnTime,
   COUNT(case
           when dbo.SessionEvals.InstructorPromptness = 'Late' then 1
           else null
         end) AS SpeakerLate,
   COUNT(case
           when dbo.SessionEvals.InstructorPromptness = 'NoShow' then 1
           else null
         end) AS SpeakerNoShow,
   COUNT(case
           when dbo.SessionEvals.PercentFull = '10% to 90%' then 1
           else null
         end) AS PercentFull10to90,
   COUNT(case
           when dbo.SessionEvals.PercentFull = '> 90%' then 1
           else null
         end) AS PercentFullGreaterThan90,
   COUNT(case
           when dbo.SessionEvals.PercentFull = ' < 10% Full ' then 1
           else null
         end) AS PercentFullLessThan10,
   AVG(Cast (dbo.SessionEvals.EstimatedNumberAttendees as Float)) AS
   EstimatedAttending
FROM dbo.Sessions
 INNER JOIN dbo.SessionEvals ON (dbo.Sessions.Id =
 dbo.SessionEvals.SessionId)
WHERE dbo.Sessions.CodeCampYearId = 8
GROUP BY dbo.SessionEvals.SessionId
4

3 に答える 3

2

AVG は NULL を省略します。したがって、0 を NULL として扱うようにします。そのためにNULLIFを使用します。

...
AVG(NULLIF(Cast (dbo.SessionEvals.CourseAsWhole as Float), 0)) AS CourseAsWholeAvg,
...
AVG(NULLIF(Cast (dbo.SessionEvals.EstimatedNumberAttendees as Float), 0)) AS EstimatedAttending
...
于 2013-10-10T20:02:02.783 に答える
0

内部クエリを使用して同じセッションを取得できますが、ゼロと null は除外されます。

SELECT dbo.SessionEvals.SessionId,
   (
        SELECT AVG(SE1.CourseAsWhole)
        FROM dbo.SessionEvals SE1
        WHERE SE1.SessionId = dbo.SessionEvals.SessionId
        AND ISNULL(SE1.CourseAsWhole, 0) <> 0
   ) AS CourseAsWholeAvg,
   COUNT(*),
   COUNT(case
           when dbo.SessionEvals.InstructorPromptness = 'On Time' then 1
           else null
         end) AS SpeakerOnTime,
   COUNT(case
           when dbo.SessionEvals.InstructorPromptness = 'Late' then 1
           else null
         end) AS SpeakerLate,
   COUNT(case
           when dbo.SessionEvals.InstructorPromptness = 'NoShow' then 1
           else null
         end) AS SpeakerNoShow,
   COUNT(case
           when dbo.SessionEvals.PercentFull = '10% to 90%' then 1
           else null
         end) AS PercentFull10to90,
   COUNT(case
           when dbo.SessionEvals.PercentFull = '> 90%' then 1
           else null
         end) AS PercentFullGreaterThan90,
   COUNT(case
           when dbo.SessionEvals.PercentFull = ' < 10% Full ' then 1
           else null
         end) AS PercentFullLessThan10,
   AVG(Cast (dbo.SessionEvals.EstimatedNumberAttendees as Float)) AS
   EstimatedAttending
FROM dbo.Sessions
 INNER JOIN dbo.SessionEvals ON (dbo.Sessions.Id =
 dbo.SessionEvals.SessionId)
WHERE dbo.Sessions.CodeCampYearId = 8
GROUP BY dbo.SessionEvals.SessionId
于 2013-10-10T19:56:54.787 に答える
0

SQL AVG 関数はデフォルトで null 値を無視するため、0 のみを除外する必要があります。AVG コードは次のように変更できます。

AVG(nullif( Cast(dbo.SessionEvals.CourseAsWhole as Float), 0) AS CourseAsWholeAvg
于 2013-10-10T20:02:09.823 に答える