2014-01-08 55 views
0

我在SQL中使用DATEPART按周分組。不過,我想包括空的周,不僅包括價值周。我有一個腳本,可以在幾周內完美地收集數據,但不是空的周。我一直在嘗試使用左外連接,但是我的SQL技能並不是那麼棒。我決定問你們。在SQL中選擇空白周

這裏是我的腳本:

select 
    DatePart(Year, MYTABLE.CREATION_DATE) as DateYear, 
    DatePart(Month, MYTABLE.CREATION_DATE) as DateMonth, 
    DatePart(Week, MYTABLE.CREATION_DATE) as DateWeek, 
    sum(cast(MYTABLE.BASE_TRANSACTION_VALUE as int)) as Value, 
    min(MYTABLE.CREATION_DATE) as DateT 
from MYTABLE 
where MYTABLE.SEGMENT2 like '00601' 
    and MYTABLE.SEGMENT4 like '%' 
    and MYTABLE.CREATION_DATE > '2012-12-30 12:00:00' 
    and MYTABLE.CREATION_DATE < '2013-12-30 11:00:00' 
group by 
    DatePart(Year, MYTABLE.CREATION_DATE), 
    DatePart(Month, MYTABLE.CREATION_DATE), 
    DatePart(Week, MYTABLE.CREATION_DATE) 
order by DateYear, DateMonth, DateWeek 

這是腳本的結果。

enter image description here

難道你們可能給我一個連接語句可能看起來像在這種情況下的一個例子嗎?

+0

您需要一個包含52個數字的表格。 – Kermit

+0

請給出一些表格數據示例 – Melon

+0

@Melon圖片OP發佈了什麼問題? – Kermit

回答

4

這應該這樣做。我的SQLFiddle是http://www.sqlfiddle.com/#!6/b777f/1/0

declare @WeekTable table(
    [WeekDate] datetime 
) 
declare @startDate datetime, 
@EndDate datetime 
select @startDate = '1/1/2013',@EndDate = '12/31/2013' 
while @startDate<[email protected] begin 
    insert into @WeekTable values(@startDate) 
    set @startDate = @startDate+7 
end 

select 
    DatePart(Year, [WeekDate]) as DateYear, 
    DatePart(Month, [WeekDate]) as DateMonth, 
    DatePart(Week, [WeekDate]) as DateWeek, 
    sum(cast(MYTABLE.BASE_TRANSACTION_VALUE as int)) as Value, 
    min(isnull(MYTABLE.CREATION_DATE,[WeekDate])) as DateT 
from 
    @WeekTable 
    left outer join 
    MYTABLE 
    on 
    DatePart(Week,MYTABLE.CREATION_DATE) =DatePart(Week, [WeekDate]) 
    and 
    DatePart(Year,MYTABLE.CREATION_DATE) =DatePart(Year, [WeekDate]) 
    and 
    MYTABLE.SEGMENT2 like '00601' 
    and 
    MYTABLE.SEGMENT4 like '%' 
group by 
    DatePart(Year, [WeekDate]) , 
    DatePart(Month, [WeekDate]), 
    DatePart(Week, [WeekDate]) 
order by 
    DateYear, DateMonth, DateWeek 
+0

謝謝你的回答@KyleUp,但是由於某些原因,所有的值始終爲空。 – gardarvalur

+1

@gardarvalur空值是空的星期。您可以將Value列更改爲'isnull(sum(cast(MYTABLE.BASE_TRANSACTION_VALUE as int)),0)作爲值'使其成爲零而不是零。 – KyleUp

+0

我其實是去了另一個答案,它像一個魅力。但我會爲你付出努力,謝謝你的幫助:) – gardarvalur

6

[更新2014年1月9日08:06 UTC]

您可以創建動態的日期(日期範圍)和外連接到您的選擇是這樣的:

declare @startdate date; 
set @startdate = '2012-12-30'; 
declare @enddate date; 
set @enddate = '2013-12-30' 

;with DateRange AS 
(
    SELECT 
     DatePart(Year, @startdate) as DateYear, 
     DatePart(Month, @startdate) as DateMonth, 
     DatePart(iso_Week, @startdate) as DateWeek, 
     @startdate as DateValue 
    UNION ALL 
    SELECT 
     DatePart(Year, dateadd(dd,7,DateValue)) as DateYear, 
     DatePart(Month, dateadd(dd,7,DateValue)) as DateMonth, 
     DatePart(iso_Week, dateadd(dd,7,DateValue)) as DateWeek, 
     dateadd(dd,7,DateValue) 
    FROM DateRange 
    WHERE dateadd(dd,7,DateValue) <= @enddate 
), data as (
    select 
     DatePart(Year, MYTABLE.CREATION_DATE) as DateYear, 
     DatePart(Month, MYTABLE.CREATION_DATE) as DateMonth, 
     DatePart(iso_Week, MYTABLE.CREATION_DATE) as DateWeek, 
     sum(cast(MYTABLE.BASE_TRANSACTION_VALUE as int)) as Value, 
     min(MYTABLE.CREATION_DATE) as DateT 
    from MYTABLE 
    where MYTABLE.SEGMENT2 like '00601' 
     and MYTABLE.SEGMENT4 like '%' 
     and MYTABLE.CREATION_DATE > '2012-12-30 12:00:00' 
     and MYTABLE.CREATION_DATE < '2013-12-30 11:00:00' 
    group by 
     DatePart(Year, MYTABLE.CREATION_DATE), 
     DatePart(Month, MYTABLE.CREATION_DATE), 
     DatePart(iso_Week, MYTABLE.CREATION_DATE) 
) 
select 
    DateRange.DateYear, 
    DateRange.DateMonth, 
    DateRange.DateWeek, 
    data.Value, 
    data.DateT 
from data 
right outer join 
DateRange 
on 
    data.DateYear = DateRange.DateYear 
and data.DateWeek = DateRange.DateWeek 
order by 
    DateRange.DateYear, 
    DateRange.DateMonth, 
    DateRange.DateWeek 
+0

感謝您的回答@BrettSchneider,但由於某些原因,空記錄不會被提取到數據集中。只有和以前一樣的記錄。 – gardarvalur

+0

如果您正在尋找2013年的第01周,sql服務器會將該周分成兩半(因此爲第53周),並稱爲新年第1周的前幾天,因爲兩週共有7天,無論是53還是1向前移動一週時跳過。我將代碼更改爲使用iso_week,其中每週都有七天的時間 –

+1

您正在使用where子句,並且它正在否定外連接,因此您只能獲得有數據周的結果。 此外,如果您每月和每週加入,則幾個星期會跨越多個月,因此您最終會篩選出匹配。 –