2016-05-06 9 views
1

私はFinalDate列を週番号にグループ化し、その次のセルのその週のThisApp列を合計するように、SQL Serverのテーブルから選択しようとしています。私はオンラインで見て、私が何をしているのか分からないようです。空の週を含む週番号と合計の他の列

これは私がT-SQLで行うことができたものだった場合、私は不思議でしたか?

FinalDate ThisApp 
    ------------------------ 
    15/04/2016 20459.92 
    29/05/2016 7521.89 
    30/05/2016 5963.61 
    31/05/2016 3293.72 
    03/06/2016 27413.20 
    04/06/2016 8392.16 
    05/06/2016 7789.46 
    05/06/2016 11414.73 
    10/06/2016 48893.46 
    11/06/2016 14685.47 
    11/06/2016 7030.03 

私は週番号とFinalDate列を交換し、それぞれの週番号のためThis Appを合計するとよいでしょう:

これらは、現在、私のテーブル内の行です。また

私は連続週番号を表示することが必要になりますので、私は、例えばので、それは、任意の数週間をスキップしたいとは思わないでしょう。

FinalDate ThisApp 
    ------------------------ 
    01/01/2016 10.00 -- (Would be week 1) 
    02/01/2016 10.00 -- (Would be week 1) 
    15/01/2016 10.00 -- (Would be week 3) 

は次のように表示していました:

FinalDate ThisApp 
    ------------------------ 
    1   20.00 
    2   0.00 --This would show as 0.00 because there was no week 2. 
    3   10.00 

これは非常に具体的な要求であり、私はSQLでこれを行うことができるのだろうかと思いました。週間0あなたはweeknumbers(1-52)と、それにright joinを持つテーブルを作成する必要がデータセット内に存在しない得るために

+0

良いヒントは、混乱を避けるためにここに日付を投稿する際にMM/DD/YYYYを使用することです。ここで

は、あなたが使うべきものです。 DD/MM/YYYYを使用すると、ほとんどの人がそのフォーマットを想定しますが、他の方法では不可能なもの('15/01/2016 'のようなもの)を含めなければ混乱することがあります。面白い、 –

答えて

1
DECLARE @tmp table(dat datetime, 
        val float) 

insert into @tmp 
values ('15/04/2016' , 20459.92), 
     ('29/05/2016', 7521.89), 
     ('30/05/2016', 5963.61), 
     ('31/05/2016', 3293.72), 
     ('03/06/2016', 27413.20), 
     ('04/06/2016', 8392.16), 
     ('05/06/2016', 7789.46), 
     ('05/06/2016', 11414.73), 
     ('10/06/2016', 48893.46), 
     ('11/06/2016', 14685.47), 
     ('11/06/2016', 7030.03) 

SELECT Weeknumb, 
     ISNULL(sumvals,0) as weekval 
FROM 
    (SELECT DATEPART(ISOWK,DATEADD(wk,t2.number,'2016')) as Weeknumb 
    FROM master..spt_values t2 
    WHERE t2.type = 'P' 
    AND t2.number <= 255 
    AND YEAR(DATEADD(wk,t2.number,'2016'))=2016)allWeeks 
    LEFT JOIN 
    (SELECT sum(val) as sumvals, 
      datepart(ISOWK,dat) as weeks 
    FROM @tmp 
    GROUP BY datepart(ISOWK,dat)) actualData 
    ON weeks = Weeknumb 
    ORDER BY Weeknumb asc 

あなたが行く:その場合はあなたのような何かを得ると思います。自分の価値観を持つ2016のすべての週は

+0

このクエリは、指定された年(この場合は2016年)のみ有効です。 –

1
SELECT DATEPART(WEEK, FinalDate) FinalDate 
,  SUM(ThisApp) ThisApp 
FROM  Your_Table 
GROUP BY DATEPART(WEEK, FinalDate) 

。そこ

SELECT  wk.Number 
,    ISNULL(SUM(ThisApp), 0) 
FROM   Your_Table T 
RIGHT JOIN WeekNumbers wk 
      ON wk.Number = DATEPART(WEEK, T.FinalDate) 
GROUP BY  wk.Number 
+0

、私はこれを試してみて、感謝しました。私は数分で、夫婦で週末のために残しているよう –

+0

私はそれが私のために動作する場合、私は月曜日にあなたの答えを受け入れるもの、月曜日にこれをしようとする必要があります。 –

+0

幸運、そして素敵な週末 – HoneyBadger

0

HoneyBadgerの答えは良いですが、それは一緒に毎年から1つの値のグループ週意志合計(そう月1日、1975年は2016年1月1日にグループ化されます)。これを避けるには、年をグループに追加する必要があります。彼が指摘したようにあなたにも、返さなければNULL週間たい場合

また、あなたは別のテーブルが必要になります。しかし、あなたはカレンダーテーブルを作成する必要があります(これは単純で広く使われています)。週に1〜52のテーブルを作成するだけではいけません。

最後には、0が先行したり、データを成功し、あなたは開始日と終了日のパラメータを追加することになるでしょうすべての年/週のために戻さでレコードを取得しないことを確実にします。あなたはそれを受け入れるか、Your_Tableの最初と最後のFinalDateに設定することができます。

DECLARE @StartDate date = (SELECT MIN(FinalDate) FROM Your_Table), 
     @EndDate date = (SELECT MAX(FinalDate) FROM Your_Table) 

SELECT YEAR(C.BaseDate) AS [Year], 
     DATEPART(WEEK, C.BaseDate) AS [Week], 
     ISNULL(SUM(YT.ThisApp), 0) AS [This App Total] 
FROM  Calendar C 
LEFT OUTER JOIN Your_Table YT 
    ON C.BaseDate = CAST(YT.FinalDate AS DATE) 
WHERE C.BaseDate BETWEEN @StartDate AND @EndDate 
GROUP BY YEAR(C.BaseDate), 
     DATEPART(WEEK, C.BaseDate)