2016-10-17 3 views
1

한 달에 주간 합계를 원합니다. 일부 주 또는 미래 주는 포함되지 않습니다. 주 월요일부터 일요일까지 시작됩니다.SQL Server : 1 주일 내 전체 주

나는 이런 식으로, 당신의 요구에 부합하는 일정 테이블을 작성

Date   Value  -- Comments 
---------------------------------------------------------------------- 
2016-10-01  7  Ignore this because its not a whole week in a month 
2016-10-05  8  Week 1 
2016-10-07  5  Week 1 
2016-10-11  2  Week 2 
2016-10-15  1  Week 2  
2016-10-17  9  Ignore this because the week is not finished yet 

OUTPUT

WeekNo   Total 
    41    13 
    42    3 
+0

예상되는 결과는 무엇입니까? 그냥 그 전체 주 평균은 – Wanderer

+0

무엇입니까? –

+0

예 : 현재 달력 월. 우리는 이번 달 전체 주간이 아니기 때문에 26Sep-20ct 주와 31Oct-6Nov 주를 무시할 것입니다. – Visionist

답변

1
DECLARE @StartDate datetime = '2011-10-01'; 
DECLARE @EndDate datetime = '2016-10-31'; 
SELECT 
    CAST(DATEADD(dd, -DATEPART(dw, tblData.RecordDate) + 2, tblData.RecordDate) AS date) AS WeekStart, 
    CAST(DATEADD(dd, -DATEPART(dw, tblData.RecordDate) + 8, tblData.RecordDate) AS date) AS WeekEnd, 
    SUM(Value) AS Total 
FROM tblData 

WHERE (@StartDate IS NULL 
OR CAST(DATEADD(dd, -DATEPART(dw, tblData.RecordDate) + 2, tblData.RecordDate) AS date) >= CAST(@StartDate AS date)) 
AND (@EndDate IS NULL 
OR CAST(DATEADD(dd, -DATEPART(dw, tblData.RecordDate) + 8, tblData.RecordDate) AS date) <= CAST(@EndDate AS date)) 
AND CAST(DATEADD(dd, -DATEPART(dw, tblData.RecordDate) + 8, tblData.RecordDate) AS date) < CAST(GETDATE() AS date) 
GROUP BY CAST(DATEADD(dd, -DATEPART(dw, tblData.RecordDate) + 2, tblData.RecordDate) AS date), 
     CAST(DATEADD(dd, -DATEPART(dw, tblData.RecordDate) + 8, tblData.RecordDate) AS date) 
0

같은 테이블 구조를 가지고 :

create table calendarTable ([date] date, weekNro int) 
     go 

    insert into calendarTable 
    select dateadd(d,n,'20160101'), DATEPART(WK,dateadd(d,n,'20151231')) 
    from numbers where n<500 

것은 당신이없는 경우 숫자 표를 만들려면 먼저 표를 만들어야합니다. 이 같은 주에 완성 된이

SET NOCOUNT ON  
CREATE TABLE Numbers (n bigint PRIMARY KEY)  
GO  
DECLARE @numbers table(number int); 
WITH numbers(number) as ( 
SELECT 1 AS number 
UNION all 
SELECT number+1 FROM numbers WHERE number<10000 
) 
INSERT INTO @numbers(number) 
SELECT number FROM numbers OPTION(maxrecursion 10000) 
INSERT INTO Numbers(n) SELECT number FROM @numbers 

그런 다음 마음 실제 날짜에 가진 달력 테이블에 합류하여 테이블을 쿼리처럼 :

-1
Select DATEPART(ww, date) , SUM(Case When Comments Like '%1' then Value when Comments Like '%2' then Value else Value end) 

from schema.tablename 

group by DATEPART(ww,date) 

나는이 작동하지 않는 경우 죄송합니다, 그것은 유일한 방법 나는 그것을 구조화하려고 생각했다.

+0

이 질문에 설명 된 문제를 어떻게 해결할 수 있을지 명확하지 않음 – dlatikay

1

더 쉬운 방법은 탈리 "날짜"테이블을 만드는 것입니다. 당신이 원하는 탈리 표에서를 생성 할 수 있습니다

DECLARE @StartDate DATE = '20160101' 
    , @EndDate DATE = '20161231'; 

WITH cte AS (
SELECT DATEADD(DAY, n - 1, @StartDate) AS date 
FROM tally 
WHERE n - 1 <= DATEDIFF(DAY, @StartDate, @EndDate) 
) 
SELECT 
    c.date 
    ,YEAR(c.date) AS Year 
    ,MONTH(c.date) AS Month 
    ,DAY(c.date) AS Month 
    ,DATEPART(WEEK,c.date) AS Week 
    ,CASE WHEN 7<>COUNT(c.date) OVER (PARTITION BY YEAR(c.date),MONTH(c.date),DATEPART(WEEK,c.date)) THEN 0 ELSE 1 END AS isFullWeek 
FROM cte c 

그럼 그냥 지금 당신이 필요로하는 쿼리 무엇인지에 가입해야합니다.

관련 문제