在SQL中选择空周

在SQL中选择空周,sql,sql-server,Sql,Sql Server,我在SQL中使用DATEPART按周分组。但是,我还想包括空周,而不仅仅是包含值的周。我有一个脚本,它可以完美地按周收集数据,而不是空周。我一直在尝试使用leftouterjoin,但我的SQL技能并不是很好。我决定问问你们 这是我的剧本: select DatePart(Year, MYTABLE.CREATION_DATE) as DateYear, DatePart(Month, MYTABLE.CREATION_DATE) as DateMonth, DateP

我在SQL中使用DATEPART按周分组。但是,我还想包括空周,而不仅仅是包含值的周。我有一个脚本,它可以完美地按周收集数据,而不是空周。我一直在尝试使用leftouterjoin,但我的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
这就是剧本的结果


你们能给我举一个连接子句在这种情况下的示例吗?

[更新日期2014-01-09 08:06 UTC]

您可以动态创建日期DateRange,并通过如下方式将其连接到您的选择中:

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

这应该可以做到。我的小提琴是


您需要一个有52个数字的表格。请提供一些表格数据example@Melon发布的图像OP有什么问题?@FreshPrinceOfSO完全没有,只是img是他的脚本的输出,我要求提供未剪切的表数据。@gardarvalur在这里提供了一个实例:此外,我们可以在发布之前测试我们的响应!!人人都赢!谢谢您的回答@KyleUp,但是由于某些原因,所有的值总是空的。@gardarvalur空的值都是空的。您可以将Value列更改为isnullsumcastMYTABLE.BASE_TRANSACTION_Value为int,0为Value,使其为零而不是null。实际上,我选择了另一个答案,它工作起来很有魅力。但是我要感谢你的努力,谢谢你的帮助:没问题@BrettSchneider在查询任何重叠2个月的一周时仍然存在问题。例如,日期1/28-1/31在第5周第1个月。他每月都会参加。所以第5周只在第2个月。结果中只包括2/1-2/3。这个问题影响到任何一周,跨越多个月。嗯。。。我没有注意到@KyleUp,所以你是说我应该只在一周内加入?谢谢你的回答@BrettSchneider,但是出于某种原因,空记录没有被提取到数据集中。只有与以前相同的记录。如果您要查找2013年的第01周,sql server会将该周从第53周开始一分为二,并调用新年第一周的前几天。由于两周总共是7天,向前移动一周时跳过53天或1天。我将代码改为使用iso_week,其中每周七天。您使用的是where子句,它否定了外部联接,因此您只能在有数据的几周内获得结果。此外,如果你每月和每周都加入,有些周会跨越多个月,因此你最终会过滤掉点击量。@KevinUp:谢谢!我改变了代码,这样的地方是封装和连接后作出哈哈!这就成功了@BrettSchneider!现在一切都很顺利,谢谢大家:
declare @WeekTable table(
    [WeekDate] datetime
)
declare @startDate datetime,
@EndDate datetime
select @startDate = '1/1/2013',@EndDate = '12/31/2013'
while @startDate<=@EndDate 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