-1

我有这张桌子

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 月、3 月(或任何用户选择) 按月安排的访问量如何?

注意:每个月没有精确的从星期日开始或在星期六结束,并且 monts 没有相同数量的天数。

我相信我可以得到用户选择的每个月的第一天和最后一天

使用循环和选择 datepart > datepart(weekday,'1/'+(some month)+'\'+year_choosed_by_user)

我相信我能得到一些东西

month, startday, lastday, days
1        0         2       31
2        3         3       29
3        4         6       30

其中 0 = 星期日和 6 = 星期六,有帮助吗?我将使用 datepart 得到这个#tmptable

4

2 回答 2

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)

请参阅带有演示的 SQL Fiddle

结果:

| TOTALAPPTS |    MONTH |
-------------------------
|          5 | December |
|        122 | November |
|        125 |  October |
于 2012-11-30T18:42:27.120 回答
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值对应于周二、周三、周四,就像您的多个列一样。

那么这有什么帮助呢?您可以使用按位运算符来构造查询。

例如,如果您需要确定客户在星期一访问的内容,则需要OR天数列及其值 2。

对于在 5 月和 6 月访问的客户,您将使用值 48。

此建议可能对您减少列数和简化查询很有用,但我不能 100% 确定您在问什么。

于 2012-11-30T18:28:46.850 回答