2016-10-17 14 views
1

1か月間に週合計が必要です。部分週または未来の週は含まれません。週は月曜日から日曜日に始まります。SQL Server:1週間に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

期待される出力は何ですか?その1週間の平均は何ですか? – Wanderer

+0

を追加してください。 –

+0

例:現在の暦月です。今月中の週数ではないため、26週-30週と31週-6週の週は無視されます。 – 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

簡単な方法は、Tallyの「日付」テーブルを作成することです。次に、あなただけの今まであなたが必要とするクエリ何に参加する必要が

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 

: あなたは次のように任意のタリーテーブルからそれを生成することができます。

関連する問題