我有这张桌子
customer sunday monday tuesday wedesneday thursday friday saturday
1 0 0 1 1 1 0 0
2 0 1 0 0 0 0 1
3 0 0 1 0 1 0 1
4 0 0 1 1 0 1 0
5 0 1 0 0 1 1 1
6 0 0 1 0 1 1 0
7 0 1 0 1 1 0 1
8 0 0 0 0 1 1 0
9 0 1 1 1 0 0 1
现在我有下一个参数> 1月和2月,2月,3月(或任何用户选择) 按月安排的访问次数如何?
注意:每个月没有精确的星期日开始或星期六和星期一完成 没有相同数量的天数。
我相信我可以获得用户选择的每个月的第一天和最后一天
使用循环和选择使用datepart> datepart(工作日,'1 /'+(某个月)+'\'+ year_choosed_by_user)
我相信我能得到一些东西
month, startday, lastday, days
1 0 2 31
2 3 3 29
3 4 6 30
其中0 =星期日,6 =星期六,它有帮助吗?我将使用datepart
获得#tmptable答案 0 :(得分:5)
我不清楚你要做什么,但下面的解决方案,创建一个日期列表,UNPIVOT
你现有的数据,然后计算每个月的约会数:
;with dates (datevalue) as
(
select cast('2012-10-01' as datetime)
union all
select dateadd(d, 1, datevalue)
from dates
where dateadd(d, 1, datevalue) <= cast('2012-12-01' as datetime)
)
select count(*) TotalAppts, datename(month, d.datevalue) [Month]
from dates d
inner join
(
select client, value, col
from yourtable
unpivot
(
value
for col in (Sunday, Monday, Tuesday, Wednesday,
Thursday, Friday, Saturday)
) unpiv
) src
on datename(dw, d.datevalue) = col
where value = 1
group by datename(month, d.datevalue)
结果:
| TOTALAPPTS | MONTH |
-------------------------
| 5 | December |
| 122 | November |
| 125 | October |
答案 1 :(得分:0)
你可能会采用某种位掩码。例如,根据二进制数指定星期几:
Sunday 1
Monday 2
Tuesday 4
Wednesday 8
Thursday 16
Friday 32
Saturday 64
同样的一年中的几个月:
January 1
February 2
March 4
April 8
May 16
June 32
July 64
August 128
September 256
October 512
November 1024
December 2048
在表结构中,您只需要三列,如下所示:
customer_id (INT) days (INT) months (INT)
1 28 0
2 66 0
3 84 0
客户1周二,周三和周四访问。这些值等于28,如上例所示。对于任何给定的星期几组合,由于二进制加法,得到的数字是唯一的。如果解构整数28,则它具有二进制形式:
00011100
如果您只考虑最后7个位置,则1
值对应于周二,周三,周四,就像您的多列一样。
那么这有什么用呢?您可以使用bitwise operators构建查询。
例如,如果您需要确定客户在星期一访问的内容,则需要OR
天数列及其值2。
对于5月和6月访问的客户,您将使用值48。
这个建议可能会对您减少列数和简化查询有所帮助,但我不能100%确定您的要求。