2014-10-01 2 views
0

해결해야 할 과제가 있습니다. 다이어그램에서 두 시스템 (number1 & 2)의 작업 시간을 표시하려고합니다. 따라서 나는 테이블에 정보를 저장한다. 열은 id, date, number1, number2입니다. 나는 다음과 같은 데이터를 검색하는 데 필요한 정보를 표시하는C# SQL 쿼리를 기반으로 두 행의 차이를 계산하십시오.

id date  number1 number2 

    1| 24.09.14 | 100 | 120 

    2| 01.10.14 | 150 |  160 

: 내가이 특정 데이터 세트가 있다고 가정 할 수 있습니다.

((number1(2)- number1(1)) + number2(2) - number1(1))/2)/(number of days (date2 - date1)) 

다음과 같은 특정 번호가 있어야합니다.

((150-100 + 160-120)/2)/7= 6,42 

또는 간단히 말해서. 결과는 모든 컴퓨터에서 얻은 일일 평균 작업 시간이어야합니다. 날짜 수에서 토요일과 일요일을 Substracting하는 것은 좋지만 필수는 아닙니다.

당신이 내 질문을 이해하기를 바랍니다. 본질적으로 나는 간단한 SQL 쿼리에서 다른 행을 사용하는 방법을 모르는 문제에 직면하고있다. 프로그래밍 언어는 면도기 기반 웹 프로젝트에서 C#입니다.

+1

'간단한'검색어로이 작업을 수행 할 수 있을지 의심 스럽습니다. 저장 프로 시저에 대해 생각해보십시오. – Reniuz

+0

특정 날짜의 모든 날짜의 평균을 계산 하시겠습니까? – yogi970

+0

대신 저장 프로 시저를 사용하십시오. ** LINQ **를 사용해보십시오. 데이터 집합을 쿼리하는 잘 구성된 linq 문이 도움이 될 것입니다. – Gowtham

답변

0

처음에 큰 작동합니다. 다음은 DataSet의 2 행마다 계산을 수행하는 코드입니다.

for(int i=0; i < dst.Tables[0].Rows.Count - 1; i+=2) 
{ 
    if(dst.Tables[0].Rows.Count % 2 != 0) 
     Console.WriteLine("Wrong records count") 

    int number1Row1 =Convert.ToInt32(dst.Tables[0].Rows[i]["Number1"]); 
    int number1Row2 =Convert.ToInt32(dst.Tables[0].Rows[i]["Number2"]); 
    int number2Row1 =Convert.ToInt32(dst.Tables[0].Rows[i+1]["Number1"]); 
    int number2Row2 =Convert.ToInt32(dst.Tables[0].Rows[i+1]["Number2"]); 

    DateTime dateRow1 =Convert.ToDateTime(dst.Tables[0].Rows[i]["Date"]); 
    DateTime dateRow2 =Convert.ToDateTime(dst.Tables[0].Rows[i+1]["Date"]); 

    double calc = ((number1Row2- number1Row1 + number2Row2 - number2Row1)/2)*(dateRow1 - dateRow2).TotalDays 

    Console.WriteLine(calc); 
} 

이해하기 쉽도록 최대로 울려 퍼집니다.

0

네, 당신은 SQL 쿼리와 함께 할 수 있습니다. 아래 쿼리를 사용해보십시오.

SELECT 
     N1.Date as PeriodStartDate, 
     N2.Date as PeriodEndDate, 
     CAST(CAST((((N2.number1- N1.number1) + (n2.number2 - N1.number2))/2) AS DECIMAL(18,2))/(datediff(d,n1.date,n2.date)) AS DECIMAL(18,2)) AS AverageDailyOperation 
FROM 
[dbo].[NumberTable] N1 
INNER JOIN 
[dbo].[NumberTable] N2 
ON N2.Date>N1.Date 

테이블 이름을 NumberTable로 가정하고, 의미있는 이름으로 만들기 위해 PeriodStartDate와 PeriodEndDate를 추가했습니다. 필요에 따라 제거 할 수 있습니다.

0

귀하의 포뮬이 수치 시료의 앞에 아마 실수 있습니다
(- 숫자 1 (1)) + 번호 2 (2) - (숫자 1 (2) 번호를 2 (1))/2)/(일수 (date2 - date1))

id 열의 값이 연대순이고 구멍이없는 경우 (1.2, 3, 4, ... OK이지만 1,3,4,6 KO .. .

SELECT t2.number1 , t1.number1, t2.number2 , t1.number1 , DATEDIFF(DAY, t2.date, t1.date) 
, (((t2.number1 - t1.number1) + t2.number2 - t1.number2) /2)/DATEDIFF(DAY, t2.date, t1.date) as result 
FROM #tmp t1 
INNER JOIN #tmp t2 ON t1.id + 1 = t2.id 
:) 다음과 같은 스크립트를 시도 할 수 있습니다

--- I create a #tmp table for test 
CREATE table #tmp 
(
id int, 
Date DateTime, 
number1 float, 
number2 float 
) 

--- insert samples data 
INSERT INTO #tmp (id, Date, number1, number2) VALUES (1, '2014-09-24T00:00:00', 100, 120), (2, '2014-10-01T00:00:00', 150, 160) 

그것은 당신이 데이터베이스 만이 기록이 의심 내 SQL 서버

관련 문제