2010-03-31 3 views
5

나는 5 분마다 (즉, 하루에 288 개 값과 며칠간의 가치가있는) 수치 데이터가 있습니다. 매일 모든 값의 합계를 반환 할 수있는 쿼리를 작성해야합니다. 그래서 현재 테이블은 다음과 같습니다시간별 집계 SQL 열 값

03/30/2010 00:01:00 -- 553 
03/30/2010 00:06:00 -- 558 
03/30/2010 00:11:00 -- 565 
03/30/2010 00:16:00 -- 565 
03/30/2010 00:21:00 -- 558 
03/30/2010 00:26:00 -- 566 
03/30/2010 00:31:00 -- 553 
... 

을 그리고이 일의 'X'번호를 계속, 나는 행 '에게 X'수를 반환하는 쿼리를 원하는 각 모두의 합계를 포함하는의 매일의 값. 이런 식으로 뭔가 :

03/30/2010 -- <sum> 
03/31/2010 -- <sum> 
04/01/2010 -- <sum> 

쿼리는 던 대스의는 WebPart 내부에 갈 것이다, 그래서 불행하게도 나는 그것을 지원하기 위해 사용자 정의 사용자 기능을 쓸 수 없습니다. 모든 논리는 하나의 큰 쿼리에 있어야합니다. 어떤 도움을 주시면 감사하겠습니다. GROUP BY 및 DATEPART를 사용하여 작업하게하려면 현재 올바른 방법인지 확인해야합니다.

답변

1

내가 값의 날짜 부분 만 반환 할 수 있기 때문에 DATEPART을 어떻게 사용할 수 있는지 모르겠다. 작동은 무엇입니까? DATEADD을 사용하여 시간과 그룹을 "null"로 지정하고 YYYY-MM-DD 00:00:00.000 형식의 값으로 그룹화합니다.

다음 쿼리는 Adventure Works 데이터베이스 (SQL Server 2005에서 테스트 한 경우)에 대비하여 작동합니다. 다른 DATEADD를 사용하는 것보다 그것은 @OMG 조랑말 제안과 매우 유사합니다 :

select 
    dateadd(dd, 0, datediff(dd, 0, OrderDate)) as SaleDay 
    , sum(taxamt) as Amount 
from 
    Sales.SalesOrderHeader 
group by 
    dateadd(dd, 0, datediff(dd, 0, OrderDate)) 
order by 
    SaleDay 

dateadd(dd, 0, datediff(dd, 0, OrderDate))의 아이디어는 먼저 "날짜까지 시간의 시작 부분에서 전달 된 일수"를 얻을 수 있습니다합니다 (datediff part의) 이 시간 수를 "시간의 시작"에 더하십시오. 어느 것이 당신에게 "당신의 하루의 시작"을줍니다. 나는 이것이 이해할 수 있기를 바랍니다 :)

2

좋은 속임수입니다. 당신이 FLOAT에 SQL DATETIME 캐스팅 경우 그것은 당신에게, 그리고 당신이 주어진 날짜에 minight 제공하는 DATETIME에 다시 전원을 켜 days.fractionofday

같은 날짜 그러므로 만약 바닥을 제공합니다.

CAST(FLOOR(CAST(MyDateTime AS FLOAT)) AS DATETIME) 

따라서, 내가 선호하는 방법은 다음과 같습니다.

select 
    CAST(FLOOR(CAST(OrderDate AS FLOAT)) AS DATETIME) 
    , sum(taxamt) as Amount 
from 
    Sales.SalesOrderHeader 
group by 
     CAST(FLOOR(CAST(OrderDate AS FLOAT)) AS DATETIME) 

이전의 모든 정답보다 더/덜 효율적인지는 알 수 없습니다.

+0

귀하의 괄호 (FLOOR (CAST ([주문일] FLOAT AS)) DATETIME AS) – Imrul

+0

감사합니다, (I 희망) – Jamiec

2

U이 따라가 날짜 유형

SELECT [ENTRY_DATE],CAST([ENTRY_DATE] AS date) AS 'date' 
FROM [PROFIT_LIST] 

이제 당신이 할 수있는 그룹에 CAST를 사용할 수 있습니다.

SELECT CAST([ENTRY_DATE] AS date) AS 'date',SUM(PROFIT) 
FROM [PROFIT_LIST] 
GROUP BY CAST([ENTRY_DATE] AS date) AS 'date' 
+0

+1 고정 잘못된 순서로 CAST이었다; 멋진 솔루션이지만 SQL 2008에서만 작동합니다 (SQL 2005에서는 "DATE"유형이 없기 때문입니다). – scherand