2016-12-21 1 views
1

하루의 값을 합산하여 완벽하게 작동하는 쿼리가 있습니다.날짜/시간이 서로 다른 날짜 사이의 합계

문제는 자정보다 큰 데이터를 다음 날 자정까지 보유해야한다는 것입니다. 테스트하려면 다음 코드를 테스트하여 하루 종일 사용하지 않는 첫 번째 값을 처리하는 데 도움이되었습니다.

DECLARE @a DATETIME 
DECLARE @b DATETIME 

SET @a = CAST('2016-03-21 00:01:00' AS DATETIME) 
SET @b = DATEADD(SECOND,-86399 ,@a) 
SELECT @a AS a, @b AS b 

SELECT CAST(fldDateTime AS DATE) AS DayValue, SUM(fldValue) AS Val 
FROM [dbo].[Data.tblMeterData] 
WHERE fldDateTime BETWEEN @b AND @a 
GROUP BY CAST(fldDateTime AS DATE) 
ORDER BY DayValue 

이 문제는 내가 처음 일 자정을 포함 할 수 없습니다 나는이 길이야에서 처리해야하는 ID의 수천을 가지고 첫 번째 데이터이기 때문에 나는, 날짜를 통해 루프를하지 않는다는 것입니다 자정 이후에 기록되고 마지막 일일 독서는 다음날 자정에 있습니다

  • 는 ID의 첫 데이트를 찾아 다음날의 첫 번째 자정까지 이동하고 모든이를 반복 :

    Date > '2016-03-20 00:00:00' AND <= 2016-03-21 00:00:00 
    

    어떻게 다음 작업을 수행 할 필요가 무엇을 할 수 다음 날.

  • 이러한 값을 자정보다 크고 다음 날 자정까지 누적하십시오.
+0

나는 약간의 샘플 데이터와 출력을 제공하는 것이 좋을 것이라고 생각한다. 당신이 원하는 것에 대해 명확하지 않다. – Cato

+1

여기에있는 테이블 데이터와 결과 중 일부를 공유하는 가장 좋은 방법은 무엇입니까 –

+0

내가 필요할 때 데이터가 자정보다 크고 다음 날 자정까지 올라가도록하려면 1/2/2016 00:00:00 = 1/2/2016 11:59:59 또는 1 초 이상의 의미가 필요합니다. 1/3/2016 00:00:00? – scsimon

답변

1

계량기 ID와 날짜별로 값 그룹 합계를 찾고 있지만 각 날짜에 다음날 값도 포함하고 싶습니다. 즉, 각 값은 해당 요일과 전날의 합계에 계산됩니다.

코드 :

--generate test data 
declare @tblMeterData table (
     [ID] [int] IDENTITY(1,1) NOT NULL, 
     [tblMeterData_Id] [int] NOT NULL, 
     [fldDateTime] [datetime] NOT NULL, 
     [fldValue] [decimal](18, 2) NULL, 
     [fldBatchId] [uniqueidentifier] NOT NULL); 

insert @tblMeterData (tblMeterData_Id, fldDateTime, fldValue, fldBatchId) values 
     (18, '2016-12-19 23:59:59', 1.0, newid()), 
     (18, '2016-12-20 00:00:00', 2.0, newid()), 
     (18, '2016-12-20 00:30:00', 3.0, newid()), 
     (18, '2016-12-20 01:00:00', 4.0, newid()), 
     (18, '2016-12-20 01:30:00', 5.0, newid()), 
     (18, '2016-12-21 00:00:00', 6.0, newid()), 
     (18, '2016-12-21 00:30:00', 7.0, newid()), 
     (18, '2016-12-22 00:00:00', 8.0, newid()), 
     (18, '2016-12-23 00:00:00', 9.0, newid()), 
     (19, '2016-12-20 00:00:00', 10.0, newid()); 

--select * from @tblMeterData order by ID; 

--main query 
with cte as (
     --0:00:00 reports on previous day 
     select *, cast(dateadd(S, -1, fldDateTime) as date) group_date 
     from @tblMeterData 

     union all 

     --duplicate all records to also group on previous day 
     select *, cast(dateadd(D, -1, dateadd(S, -1, fldDateTime)) as date) group_date 
     from @tblMeterData 
) 
select tblMeterData_Id, group_date, sum(fldValue) sum_value 
from cte 
group by tblMeterData_Id, group_date 
order by tblMeterData_Id, group_date; 

결과 :

다음과
tblMeterData_Id group_date sum_value 
18  2016-12-18 3.00 
18  2016-12-19 21.00 
18  2016-12-20 33.00 
18  2016-12-21 24.00 
18  2016-12-22 9.00 
19  2016-12-18 10.00 
19  2016-12-19 10.00 
+0

여기에 텍스트 파일에 데이터를 입력했습니다. https://www.dropbox.com/s/s7dcemgbaqa37d4/TestData.txt?dl=0 –

+0

쿼리를 시도했지만 올바르게 합쳐지지 않았습니다. '2016-03-20 00 : 30 : 00 '에서'2016-03-21 00 : 00 : 00 '까지의 첫 번째 합계는 662.98이어야합니다. 가깝기 때문에 나와 함께 놀기 좋은 시작이다. 고마워. –

+1

> 0:00:00 부분을 놓친 것 같고 결과는> 0:00:00입니다. 나는 그것을 다루는 몇 분 안에 새로운 버전을 설치할 것이다. – SMM

1

대답은 같이 그것은 완벽하게 작동

WITH cte AS (  

SELECT *, CAST(DATEADD(S, -1, fldDateTime) AS DATE) group_date 
FROM [dbo].[Data.tblMeterData]    

) 
SELECT tblMeterData_Id, group_date, SUM(fldValue) sum_value 
FROM cte 
GROUP BY tblMeterData_Id, group_date 
ORDER BY tblMeterData_Id, group_date; 

.

+0

오, 당신은 자정이 전날로 옮겨지면서 현재 날짜를 원했습니다. 죄송합니다! – SMM

+0

주된 문제를 해결 했으므로 나는 정답을 알려준다. –

관련 문제