2015-09-14 28 views
0

編輯:數據庫 - SQL服務器2014不能上個欄目組表

我試圖計算日百分比的學生 「有」這樣的:

enter image description here

但我這樣得到結果:

enter image description here

僅限計算百分比我無法根據類對行進行分組。 帶有OUT百分比計算,結果是分組精細

我的學生考勤表..

enter image description here

這是我的查詢...

SELECT CM.ClassName ,SB.SubjectName , 
count(sa.Day14) Total, 
sum(case when sa.Day14 = 'P' then 1 else 0 end) Present, 
sum(case when sa.Day14 = 'A' then 1 else 0 end) Absent, 
(SELECT CAST(
      CASE 
        WHEN count(sa.Day14) = 0 
        THEN 0 
        ELSE (sum(case when Day14 = 'P' then 1 else 0 end)* 100)/(count(Day14)) 
      END AS nvarchar(100))) as [Present%], 
AttendanceDate from studentattendance SA 
    inner join studentmaster SM on SA.StudentID = SM.ID 
    join ProfessorMaster p on SA.ProfessorID = p.Id 
    join Classmaster CM on SA.ClassID = CM.ID 
    inner join SubjectMaster SB on SA.SubjectID = SB.ID 
    where 
     sa.ProfessorID = '36' and sa.AttendanceDate = '2015-09' and SA.AdminId ='29' 
    group by CM.ClassName, SB.SubjectName, SA.AttendanceDate,sa.Day14 

什麼我失蹤?

+0

請創建sqlfiddle或在樣本數據添加問題插入腳本 – DarkKnight

+0

一般GROUP BY規則說: 「如果指定了GROUP BY子句,在SELECT列表中的每個列引用必須要麼確定分組列或成爲一個函數的參數。「即,從GROUP BY中刪除sa.Day14列。 – jarlh

回答

0

您的查詢存在的問題是,您在第14天的Day14組中進行計數。有了這個,你不能在與你指定的組相同的查詢中進行求和。所以你必須拆分你的查詢。

假設您的考勤表在某一天的某個特定科目/班級中看起來像這樣。

  StudentID Day14  
     46    A 
     47    P 
     48    P 

如果您使用的是Oracle,那麼創建一個CTE。否則創建一個視圖來計算'A'和'P'。

  select distinct(Day14), count(*) as AorP from yourTable group by Day14 

現在,創建另一個CTE /視圖來獲取類似下面

 select DAY14, AORP*100/(select sum(AORP) as yourView from tbl2) as percentage from tbl2 

這將給總額和百分比你造成像

  Day14 PERCENTAGE   
      P   66.67 
      A   33.33 

現在加入這個以您的主查詢基於Present或Absent獲得PERCENTAGE。您也可以使用該視圖作爲聯查詢(如

select col1,(select Day14 as AbsentPercent from newView where id=something and Day14='A') 

注意:這種觀點只是舉例,你必須增加至少1個唯一標識符加入到你的主表後要捕獲缺少的項,使用適當的外部聯接。

-1

我得到了很多小的解決方案:) ... DataTable中[代碼或任何的ResultSet]

計算百分比...

我的查詢(不計算百分比)

SELECT CM.ClassName ,SB.SubjectName , 
count(sa.Day14) Total, 
sum(case when sa.Day14 = 'P' then 1 else 0 end) Present, 
sum(case when sa.Day14 = 'A' then 1 else 0 end) Absent, 
'' [Present%] , 
AttendanceDate from studentattendance SA 
    inner join studentmaster SM on SA.StudentID = SM.ID 
    join ProfessorMaster p on SA.ProfessorID = p.Id 
    join Classmaster CM on SA.ClassID = CM.ID 
    inner join SubjectMaster SB on SA.SubjectID = SB.ID 
    where 
     sa.ProfessorID = '36' and sa.AttendanceDate = '2015-09' and SA.AdminId ='29' 
    group by CM.ClassName, SB.SubjectName, SA.AttendanceDate,sa.Day14 

and in DataTable ......

foreach (DataRow dr in ds.Tables[0].Rows) 
      { 
       var Total = Convert.ToInt32(Convert.ToDouble(dr["Total"])); 
       var Present = Convert.ToInt32(Convert.ToDouble(dr["Present"])); 
       dr["Present%"] = (Present * 100)/Total; 

      }