3

我有一份我想生成的报告,其中显示了每年每周的工作数量,日期可以追溯到 90 年代初。我遇到了一个我似乎无法解决的问题,因为我的 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)

有人可以指出我做错了什么吗?

4

2 回答 2

1

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

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

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

应该让你开始。

于 2012-06-25T13:27:35.930 回答
1

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

只要您的“GROUP BY”子句编写正确,您的 CASE 语句的公式就正确,并且应该返回您正在寻找的不同结果集。

我已将您的查询重新表述为 SQL Server 查询,并根据我自己的数据确认它们确实返回了不同的结果集。

这是您所需查询的有效 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
于 2012-06-25T16:30:16.917 回答