2012-06-25 52 views
3

我有一份我想要制作的报表,显示每年每周的工作计数,日期可追溯到90年代初。我遇到了一个我似乎无法解决的问题,因为我的SQL知识不是很好。星期三开始的星期几的SQL组合

我知道MySQL限制你开始周日期或周日或周一。我想从星期三到星期二将他们分组,所以当我做GROUP BY YEAR(JOBID), WEEK(JOBID)时,它只会显示他们从星期天开始分组。

我发现这个在这里

SELECT 
    count(jobs) as count, 
    CASE WHEN (weekday(datetime)<=3) THEN date(datetime + INTERVAL (3-weekday(datetime)) DAY) 
     ELSE date(datetime + INTERVAL (3+7-weekday(datetime)) DAY) 
    END as dt 
FROM values 

,但它给了我同样的结果集

SELECT 
    COUNT(jobs), 
    Week(datetime) as Week, 
    Year(datetime) as Year 
FROM jobs 
GROUP BY Year(datetime), Week(datetime) 

有人请指出我在做什么错?

+0

您可以编辑您的问题,包括一些示例数据,与预期的结果,所以我们可以更好地帮助你? –

回答

1

最简单的解决方案是使用日历表。您可以轻松定制星期三作为开始日期,而10年的数据只有大约3650行。

http://weblogs.sqlteam.com/dang/archive/2010/07/19/calendar-table-and-datetime-functions.aspx

http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

应该让你开始。

+0

同意 - 使用日历表比仅使用SQL日期函数尝试执行此操作要好得多。 –

+0

以下是一个MySQL示例:http://www.brianshowalter.com/calendar_tables –

1

您的第一个查询不完整,并且不包含“GROUP BY”子句。确保“GROUP BY”与定义“dt”列的“CASE”表达式相同。

只要您的“GROUP BY”子句写入正确,您的CASE语句就已正确制定并应返回您正在寻找的不同结果集。

我将SQL查询重新定义为查询,并在我自己的数据上确认它们返回不同的结果集。

这是你想要的查询工作的SQL Server版本:

SELECT 
COUNT([jobs]) AS Count, 
CASE 
WHEN (DATEPART(dw, [datetime])<=3) THEN Convert(date, DATEADD(day, 3-DATEPART(dw, [datetime]), [datetime])) 
ELSE Convert(date, DATEADD(day, 3+7-DATEPART(dw, [datetime]), [datetime])) 
END AS WeekLabel 
FROM JobsTable 
GROUP BY 
CASE 
WHEN (DATEPART(dw, [datetime])<=3) THEN Convert(date, DATEADD(day, 3-DATEPART(dw, [datetime]), [datetime])) 
ELSE Convert(date, DATEADD(day, 3+7-DATEPART(dw, [datetime]), [datetime])) 
END 
ORDER BY 
CASE 
WHEN (DATEPART(dw, [datetime])<=3) THEN Convert(date, DATEADD(day, 3-DATEPART(dw, [datetime]), [datetime])) 
ELSE Convert(date, DATEADD(day, 3+7-DATEPART(dw, [datetime]), [datetime])) 
END DESC 

还有你的另一比较查询的SQL Server版本:

SELECT COUNT([jobs]), 
DATEPART(week, [datetime]) AS WeekLabel, 
DATEPART(year, [datetime]) AS YearLabel 
FROM JobsTable 
GROUP BY DATEPART(week, [datetime]), DATEPART(year, [datetime]) 
ORDER BY DATEPART(year, [datetime]) DESC, DATEPART(week, [datetime]) DESC 
相关问题