我有一个按日期排序的跟随者。我想将每个星期系列分组如下。
Select tq.ID,
CONVERT(VARCHAR(10),tq.DateCreated,101)WeekDate,
DATENAME(WEEKDAY,tq.DateCreated)WeekDays,
CASE When DATEPART(WEEKDAY,tq.DateCreated)-1=0 THEN 7 ELSE DATEPART(WEEKDAY,tq.DateCreated)-1 END as WeekSerial
From #temp tq
当前数据:
ID WeekDate WeekDays WeekSerial WeekNumber
56 2012-03-01 00:00:00.000 Thursday 4 NULL
57 2012-03-02 00:00:00.000 Friday 5 NULL
58 2012-03-03 00:00:00.000 Saturday 6 NULL
59 2012-03-04 00:00:00.000 Sunday 7 NULL
62 2012-03-05 00:00:00.000 Monday 1 NULL
63 2012-03-06 00:00:00.000 Tuesday 2 NULL
64 2012-03-07 00:00:00.000 Wednesday 3 NULL
65 2012-03-08 00:00:00.000 Thursday 4 NULL
67 2012-03-09 00:00:00.000 Friday 5 NULL
68 2012-03-10 00:00:00.000 Saturday 6 NULL
69 2012-03-11 00:00:00.000 Sunday 7 NULL
70 2012-03-12 00:00:00.000 Monday 1 NULL
71 2012-03-13 00:00:00.000 Tuesday 2 NULL
73 2012-03-14 00:00:00.000 Wednesday 3 NULL
74 2012-03-15 00:00:00.000 Thursday 4 NULL
76 2012-03-16 00:00:00.000 Friday 5 NULL
77 2012-03-17 00:00:00.000 Saturday 6 NULL
78 2012-03-18 00:00:00.000 Sunday 7 NULL
必填数据
ID WeekDate WeekDays WeekSerial WeekNumber
56 2012-03-01 00:00:00.000 Thursday 4 1
57 2012-03-02 00:00:00.000 Friday 5 1
58 2012-03-03 00:00:00.000 Saturday 6 1
59 2012-03-04 00:00:00.000 Sunday 7 1
62 2012-03-05 00:00:00.000 Monday 1 2
63 2012-03-06 00:00:00.000 Tuesday 2 2
64 2012-03-07 00:00:00.000 Wednesday 3 2
65 2012-03-08 00:00:00.000 Thursday 4 2
67 2012-03-09 00:00:00.000 Friday 5 2
68 2012-03-10 00:00:00.000 Saturday 6 2
69 2012-03-11 00:00:00.000 Sunday 7 2
70 2012-03-12 00:00:00.000 Monday 1 3
71 2012-03-13 00:00:00.000 Tuesday 2 3
73 2012-03-14 00:00:00.000 Wednesday 3 3
74 2012-03-15 00:00:00.000 Thursday 4 3
76 2012-03-16 00:00:00.000 Friday 5 3
77 2012-03-17 00:00:00.000 Saturday 6 3
78 2012-03-18 00:00:00.000 Sunday 7 3
所以,我想将这些值分组,以周数为单位,对于WeekSerial数字范围从1到7必须从1开始。
注意: 工作日从星期一到星期日开始,因此编号从1到7.即1 =星期一,2 =星期二等等......!
更新
INSERT INTO #Temp(KioskCount,KioskAmount,KioskAverage,WeekDate,WeekDays,WeekSerial)
Select COUNT(tq.quoteid)KioskCount,
SUM(tq.PriceQuote) [KioskAmount],
SUM(tq.PriceQuote) / COUNT(tq.QuoteID) [KioskAverage],
CONVERT(VARCHAR(10),tq.DateCreated,101)WeekDate,
DATENAME(WEEKDAY,tq.DateCreated)WeekDays,
CASE When DATEPART(WEEKDAY,tq.DateCreated)-1=0 THEN 7 ELSE DATEPART(WEEKDAY,tq.DateCreated)-1 END as WeekSerial
from tbl_Quotes tq
where
tq.QuoteStatusID <> 12 --remove void transactions
group by CONVERT(VARCHAR(10),tq.DateCreated,101),DATENAME(WEEKDAY,tq.DateCreated),DATEPART(WEEKDAY,tq.DateCreated)-1
order by 4
答案 0 :(得分:0)
实际上还不清楚你的期望是什么
您已经提交了一个WeekDate,我认为日期是正确的,并且基于您在工作日字段中填写
然后只需循环查看日期并使用WeekDate
更新周数我可以提供一个例子
DECLARE @DATE DATETIME
DECLARE @count int
DECLARE @i int
SET @i=56// you can find your first id via query too
SET @count=(select COUNT(WeekDays) from tablename)
WHILE @i<=@count
BEGIN
SET @DATE =(select WeekDate from tablename where ID=@i)
update tablename set WeekNumber=(
SELECT DATEPART(WEEK, @DATE) -
DATEPART(WEEK, DATEADD(MM, DATEDIFF(MM,0,@DATE), 0))+ 1 AS WEEK_OF_MONTH)
where ID=@i
set @i=@i + 1
END;
它将使用相应的数字
更新所有的周数字段答案 1 :(得分:0)
这可能会对你有所帮助:
首先,您需要检查数据库中的第一天
SELECT @@DATEFIRST
默认情况下,SUNDAY是一周的第一天(美国)。所以你需要将它改为1(星期一)
SET DATEFIRST 1
在SQL Server中使用DATEPART
内置函数,您可以获得一年中的周数
SELECT DATAPART(WEEK, WeekDate)
您还可以获得所选日期时间的年份
SELECT DATAPART(YEAR, WeekDate)
如果您为第一行运行这两个查询(假设为第1周)
SELECT DATEPART(WEEK, '2012-03-01 00:00:00.000') -- Output = 10
SELECT DATEPART(YEAR, '2012-03-01 00:00:00.000') -- Output = 2012
但本周应该是你的第1周。
因此,您可以轻松地从YEAR中减去2012年,然后乘以52(因为我们一年有52周)
从WEEKNUMBER
添加您从上面获得的数字
(YEAR - 2012) * 52 + (WEEK - 9)
通过运行此功能,您可以获得实际结果
SELECT (DATEPART(YEAR, WeekDate) - 2012) * 52 + DATEPART(WEEK, WeekDate) - 9 AS WeekNumber
FROM yourTable