如何在SQL中创建对应于一个月的周列表?

时间:2011-11-01 14:23:32

标签: sql sql-server-2008

我需要创建一个类似于以下内容的报告(“WE”是周末从周日到周六):

SEPT.           
            WE 9/10     WE 9/17     WE 9/24     WE 10/1
Metric#1    40          49          58          40
Metric#2    24          25          20          1

以上可能不正确,这只是格式的一个例子。

我的问题是我不知道哪个星期对应哪几个月。例如,10月30日至11月5日那周,我不知道它属于哪个月。

他们给了我如何做到这一点的灵活性。只要它是一致的,它应该没问题。

我还可以使用那周的星期日(10月30日 - 11月5日是10月的一周,因为10月30日是星期天)。

可以在此处使用一些帮助来确定如何为特定月份分配一周。我可以进行旋转,这是我不确定的日期逻辑。该报告是过去3个月。

SQL Server 2008.报告将在SSRS 2008 R2

编辑:刚刚收到客户的要求。那个星期中天数最多的月份。例如8月28日至9月3日,那个星期8月有4天,9月有3天,因此那个星期属于8月。我会看看能不能解决这个问题。

3 个答案:

答案 0 :(得分:2)

这样的问题最好用日历表解决:http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

基本上,您构建一个天数表(10年的天数仅为3652行),并将每个日期与您要分配的日期相关联。

答案 1 :(得分:2)

您的额外要求意味着一周中的月份将始终是一周的星期三(因为您有周日周六。)

所以这样的事情可以让你获得任何日期的月份:

DECLARE @TestDate DATETIME

SET @TestDate = 'October 31, 2011'

SELECT 
   DATEADD(week, DATEDIFF(week, 0, @TestDate), 2) AS WednesdayOfWeek, -- This is Wednesday of the week.
   DATEPART(MONTH, DATEADD(week, DATEDIFF(week, 0, @TestDate), 2)) AS MonthNum,
   DATENAME(MONTH, DATEADD(week, DATEDIFF(week, 0, @TestDate), 2)) AS MonthName,
   DATEADD(MONTH, DATEDIFF(MONTH, 0, DATEADD(week, DATEDIFF(week, 0, @TestDate), 2)), 0) AS FirstOfMonth

答案 2 :(得分:2)

您可以使用星期三的日期来确定相应星期所属的月份。您的查询可能如下所示:

WITH marked AS (
  SELECT
    *,
    WednesdayDate = DATEADD(DAY, 4 - DATEPART(WEEKDAY, DateColumn), DateColumn)
  FROM atable
),
grouped AS (
  SELECT
    WeekYear   = YEAR(WednesdayDate),
    WeekMonth  = MONTH(WednesdayDate),
    WeekEnding = DATEADD(DAY, 3, WednesdayDate),
    Metric1    = AGG(...),
    Metric2    = AGG(...),
    ...
  FROM marked
  GROUP BY WednesdayDate
)
SELECT *
FROM grouped
WHERE WeekYear  = ...
  AND WeekMonth = ...

您的下一步可能是dynamic pivoting