Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果客户指定了访问天数,如何按月计算访问量_Sql_Sql Server_Sql Server 2005_Unpivot - Fatal编程技术网

Sql 如果客户指定了访问天数,如何按月计算访问量

Sql 如果客户指定了访问天数,如何按月计算访问量,sql,sql-server,sql-server-2005,unpivot,Sql,Sql Server,Sql Server 2005,Unpivot,我有这张桌子 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

我有这张桌子

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月,由任何用户选择 每个月的预定访问量是多少

注:每个月不精确地从星期日开始,或从星期六和月结束 每天的数量不一样

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

通过使用datepart>datepartweekday循环和选择,用户选择“1/”+某个月+“\”+年

我相信我能得到它所需要的东西

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

其中0=星期天和6=星期六,是否有帮助?我将使用datepart获取这个tmptable,您最好使用某种位掩码。例如,根据二进制数为一周中的几天指定一个值:

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个值对应于tues、w、ths,就像您的多个列。

那么这有什么帮助呢?您可以使用来构造查询

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

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


这个建议可能有助于减少列数和简化查询,但我不能100%确定你在问什么。

我不太清楚你想做什么,但下面的解决方案是创建一个日期列表,取消现有数据,然后计算每个月的约会次数:

;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)

你有信息丢失。第一线是几年?你还需要什么@bluefeet@FlorinGhita,客户每年都有相同的定期访问好的,我想我现在明白这个问题了。但我不擅长Sql Server,抱歉。@angel即使在评论中有您的解释,但鉴于您提供的数据,我仍然不明白这是怎么可能的。没有办法从你提出的问题中辨别出这个月。你能发布你想要的结果是什么样子吗?你不是在价值观上过滤。只计算1天。否则就好了!回答得好!我正在研究如何创建日期,这是一个很好的方法@安吉尔,把两者结合起来,你就应该set@angel:如果您还需要按客户划分数据,只需将“客户”列或“客户”或任何实际等效项添加到group by和main select。谢谢,我从未见过pivot/unpivot,但最后的结果是正确的。
| TOTALAPPTS |    MONTH |
-------------------------
|          5 | December |
|        122 | November |
|        125 |  October |