2014-06-13 4 views
0

왜 내가 vb.net 코드에서 SQL 문을 SQL Server에서 다른 결과를 제공하는 해결하기 위해 노력하고있어. 내 코드 :SQL 문에서 여러 계산 - 다른 결과

      strsql = "SELECT DISTINCT DateName(mm,DATEADD(mm,lgdatm,-1)) as lgMon, Avi, SUM((ProcElaps/60)/Emplo) as Util, Effi, SUM(((ProcElaps/60) * Avi)/Emplo) as DayProd, ProcElaps, ProcCount, NonProcCount FROM " & _ 
     "(SELECT DISTINCT lgdatm, Emplo, SUM((Emplo - (NonProcElaps/60))/Emplo) as Avi, SUM((ProcElaps/60)/(Emplo- (NonProcElaps/60))) as Effi, ProcElaps, ProcCount, NonProcCount FROM " & _ 
    "(SELECT DISTINCT lgdatm, SUM(460 * lgdat * EmpCount) as Emplo, NonProcElaps, ProcElaps, ProcCount, NonProcCount FROM " & _ 
    "(SELECT DISTINCT MONTH(LogDate) AS lgdatm, " & _ 
        "Count(DISTINCT " & _ 
        "CASE WHEN (ActivityCategory = @ActivAc) AND (MONTH([LogDate]) = @LGDat) THEN Enumber ELSE '0' END) AS EmpCount, " & _ 
        "Count(DISTINCT " & _ 
        "CASE WHEN (ActivityCategory = @ActivAc) AND (MONTH([LogDate]) = @LGDat) THEN LogDate ELSE LogDate END) lgdat, " & _ 
        "Count(" & _ 
        "CASE WHEN (ActivityCategory = @ActivAc) AND (MONTH([LogDate]) = @LGDat) THEN FirstActivity ELSE '0' END) AS ProcCount, " & _ 
        "Count(" & _ 
        "CASE WHEN (ActivityCategory = @ActivAcnon) AND (MONTH([LogDate]) = @LGDat) THEN FirstActivity ELSE '0' END) AS NonProcCount, " & _ 
        "SUM(" & _ 
        "CASE WHEN (ActivityCategory = @ActivAc) AND (MONTH([LogDate]) = @LGDat) THEN Elapsed ELSE '0' END) ProcElaps, " & _ 
        "SUM(" & _ 
        "CASE WHEN (ActivityCategory = @ActivAcnon) AND (MONTH([LogDate]) = @LGDat) THEN Elapsed ELSE '0' END) NonProcElaps " & _ 
    "FROM tblMain WHERE MONTH([LogDate]) = @LGDat " & _ 
    "GROUP BY MONTH(LogDate)) AS T1 " & _ 
    "Group By lgdatm, EmpCount, NonProcElaps, ProcElaps, ProcCount, NonProcCount) AS T2 " & _ 
    "Group BY lgdatm, Emplo, ProcElaps, ProcCount, NonProcCount) As T3 " & _ 
    "Group BY lgdatm, Avi, Effi, ProcElaps, ProcCount, NonProcCount Order By DayProd, Util, Avi, Effi" 
         Dim da As New SqlDataAdapter(strsql, cnn) 
         Dim ds As New DataSet() 
         da.SelectCommand.Parameters.AddWithValue("@ActivAc", proc) 
         da.SelectCommand.Parameters.AddWithValue("@ActivAcnon", nonproc) 
         da.SelectCommand.Parameters.AddWithValue("@LGDat", Mon) 
         da.Fill(ds, "Productivity") 
         txtDayProductivity.Text = Format(ds.Tables(0).Rows(0)(4).ToString(), "Percent") 
         txtAvailabilityTeam.Text = Format(ds.Tables(0).Rows(0)(1).ToString(), "Percent") 
         txtEfficiencyTeam.Text = Format(ds.Tables(0).Rows(0)(3).ToString(), "Percent") 
         txtUtilizationTeam.Text = Format(ds.Tables(0).Rows(0)(2).ToString(), "Percent") 
         txtTotLogg.Text = (ds.Tables(0).Rows(0)(5).ToString())/60 
         txtTotalTimeLogged.Text = (CDec(txtTotLogg.Text).ToString("N2")) & " mins" 
         txtAllProcess.Text = ds.Tables(0).Rows(0)(6).ToString() 
         txtAllNonProcess.Text = ds.Tables(0).Rows(0)(7).ToString() 

내가 별도의 쿼리에 각 스레드를 추가 할 때, 결과는이 코드의 집행 중에 얻을 것과 상당히 다르다. CASE 때문에 그것이라고 생각합니까, 아니면 CASE를 잘못 사용하고 있습니다.

는 ("@LGDat"월은) - 월 현재의 달 (수) ("@ActivAc", PROC) - 문자열 '프로세스' ("@ActivAcnon", nonproc) - 문자열 '비 공정'

도움 주셔서 감사합니다.

+0

크기를 줄이거 나 시도 할 수 있습니까? 문제를 분리하여 해결할 수 있습니다. –

+0

시도해 주셔서 감사합니다. – user2678787

답변

0

차이점을 알아 내려면 SQL Profiler을 실행하고 vb.net 코드를 실행하여 마지막으로 SQL Server로 이동할 쿼리를 확인하십시오.

+0

내 응용 프로그램이 이미 여러 사용자와 실행 중입니다. 이미 구현되어 있으며보고 용도로만 사용하고 있습니다. 모듈) 그러나, 나는 당신의 제안에 따라이 연습을했고이 쿼리는 SQL 프로파일 러를 거친다. (RPC : Completed) – user2678787

+0

TextData 열에서 쿼리를 확인 했습니까? 이 칼럼은 vb.net이 실행하기 위해 SQL 서버로 보내는 것을 정확히 알려줍니다. (mm, DATEADD이 (mm, lgdatm, -1)) ... (너무 오래) 는 그리고 이것은, SUM 등 각각의 CASE 내 전체 쿼리입니다 –

+0

예, 간부 sp_executesql을의 N'SELECT DISTINCT DATENAME SQL Server에서 직접 실행하는 것과 정확히 동일합니다. – user2678787

관련 문제