2017-07-14 128 views
0

我有一个包含类似数据的表如下:总结一天的SQL Server每周订单数据

Item  Date  Customer 
------------------------------ 
apple 01/01/2017  a 
apple 01/01/2017  a 
apple 02/01/2017  b 
apple 05/01/2017  c 
apple 06/01/2017  b 
apple 06/01/2017  d 
apple 07/01/2017  c 
apple 09/01/2017  a 
banana 01/01/2017  b 
banana 02/01/2017  a 

我需要的是由许多独特的客户如何购买了该项目当天和项目分组汇总当天的周(即日+3天)以及当天。

它应该是这样的:

Item   Date  Weekly Customers Daily Customers 
----------------------------------------------------------- 
    apple 01/01/2017   2    1 
    apple 02/01/2017   3    1 
    apple 05/01/2017   3    1 
    apple 06/01/2017   4    2 
    apple 07/01/2017   4    1 
    apple 09/01/2017   4    1 
    banana 01/01/2017   2    1 
    banana 02/01/2017   2    1 

我已经成功通过项目,天,每天独特的客户提供以下,我认为总结是正确的:

SELECT 
    item as 'Item', boughtDate as 'Date', 
    COUNT(DISTINCT(customer)) as 'Daily Customers' 
FROM tbl1 
GROUP BY Item, Date 

我真的很难与如何采取每一个不同的项目+日组合,并获得当天(一天中的任何一方3天)当周的独特客户,并加入这些结果。

我一直在玩一些循环和CTE,但我似乎没有任何值在任何给定的领域是唯一的问题。我确信有一个简单的方法来做到这一点,我只是没有想到?

+0

窗口函数 –

+0

2个子查询和连接。你应该有(或创建)一个表来帮助确定同一周的日期。 – DVT

+0

我刚看了一下窗口函数@JoePhillips。描述听起来很有希望,但似乎在OVER子句中不允许使用DISTINCT?我使用over条款来查看买家的日期,但我只需要统计不同的客户,而且客户可以每周/每周多次购买。 – learnerDev

回答

0

除了参数化您的查询,这将工作满足您的需求吗?

将日期更改为表示您的结果代表的日期的字符串?由于在本例中字符串是固定的,因此应用max()将不要求它作为group by子句的一部分。

SELECT 
     item as 'Item', 
     max('Week of 7-11 to 7-17') as 'Date', 
     COUNT(DISTINCT(customer)) as 'Weekly Customers' 
    FROM 
     tbl1 
    where 
      boughtDate >= '2017-07-11' 
     and boughtDate < '2017-07-18' 
    GROUP BY 
     Item 

或者...... 您寻找的每个个人从他们的购买+/- 3天,这可能是一个连续滚动的时间段,如果一个人进来,购买每2-3天。

+0

我应该提到实际数据涵盖了几个月的更长时间,所以我不想在查询本身中指定每个周期。 SQL应该查看表中每个不同的日期,然后从该日期+3天内选择所有客户记录,计算不同的客户并将该总数返回到该日期和项目的表中。 – learnerDev

0

SELECT item as 'Item', max('Week of 7-11 to 7-17') as 'Date', COUNT(DISTINCT(customer)) as 'Weekly Customers' FROM tbl1 where boughtDate >= '2017-07-11' and boughtDate < '2017-07-18' GROUP BY Item

我会尝试这样的事情。

相关问题