2017-10-05 46 views
1

我有一个SQL问题。我有下表:SQL Server 2014中客户端的轮换

declare @t table (date datetime, 
      shop VARCHAR(50), 
      client VARCHAR(50) 
     ); 
insert into @t 
VALUES ('2016-01-15', 'abc','a1'), 
     ('2016-01-15', 'abc','b1'), 
     ('2016-01-15', 'def','c1'), 
     ('2016-01-15', 'def','a1'), 
     ('2016-01-15', 'ghi','b1'), 
     ('2016-01-15', 'ghi','a1'), 
     ('2016-02-15', 'abc','a1'), 
     ('2016-02-15', 'abc','b1'), 
     ('2016-02-15', 'abc','c1'), 
     ('2016-02-15', 'def','a1'), 
     ('2016-02-15', 'ghi','b1'), 
     ('2016-02-15', 'ghi','a1'), 
     ('2016-03-15', 'abc','a1'), 
     ('2016-03-15', 'abc','c1'), 
     ('2016-03-15', 'def','a1'), 
     ('2016-03-15', 'ghi','b1'), 
     ('2016-03-15', 'ghi','e1') 

我wolud喜欢计算客户端的旋转。因此,对于每个月,对于每家商店,我都必须指出有多少客户流失了,有多少客户仍然是一个月前。我不能只看客户的数量,但我必须检查客户的具体名称是否在一个月前出现。所有日期看起来像这样:“年-15月”。

所以我想获得表如下:

因此,例如,对于ABC店后
declare @t2 table (date date, 
       shop VARCHAR(50), 
       churned INTEGER, 
       stayed INTEGER, 
       came INTEGER 
      ); 

INSERT INTO @t2 
VALUES ('2016-02-15', 'abc', 0, 2, 1), 
    ('2016-02-15', 'def', 1, 1, 0), 
    ('2016-02-15', 'ghi', 0, 2, 0), 
    ('2016-03-15', 'abc', 1, 2, 0), 
    ('2016-03-15', 'def', 0, 1, 0), 
    ('2016-03-15', 'ghi', 1, 1, 1) 

第一个月0客户搅动,2个客户端留校月前和1个新客户来了。 搅动意味着客户离开了。

感谢您的帮助。我使用SQL Server 2014

编辑: 再举一个例子: 对于这个数据:

declare @t table (date datetime, 
shop VARCHAR(50), 
client VARCHAR(50) 
    ); 
    insert into @t 
    VALUES ('2016-01-15', 'abc','a1'), 
    ('2016-01-15', 'abc','b1'), 

    ('2016-02-15', 'abc','b1'), 
    ('2016-02-15', 'abc','c1'), 

    ('2016-03-15', 'abc','z1'), 
    ('2016-03-15', 'abc','y1'), 
    ('2016-03-15', 'abc','a1') 

我应该得到下表:

declare @t2 table (date date, 
      shop VARCHAR(50), 
      churned INTEGER, 
      stayed INTEGER, 
      came INTEGER 
     ); 

    INSERT INTO @t2 
    VALUES 
    ('2016-01-15', 'abc', 0, 0, 2), 
    ('2016-02-15', 'abc', 1, 1, 1), 
    ('2016-03-15', 'abc', 2, 0, 3) 

这是一个只有一个简单的例子店铺澄清。

+0

定义 “搅动” 请。 – Tanner

+0

这个客户端离开了。 –

回答

1

你可以试试这个

SELECT 
    ISNULL(T1.date, DATEADD(MONTH,1,T2.date)) date, 
    ISNULL(T2.shop,T1.shop) shop, 
    COUNT(CASE WHEN T1.client IS NULL THEN 1 END) churned, 
    COUNT(case when (T1.client = T2.client) then 1 end) stayed, 
    COUNT(CASE WHEN T2.client IS NULL THEN 1 END) came 
FROM 
    @t T1 
    FULL JOIN @t T2 ON MONTH(T1.date) - 1 = MONTH(T2.[date]) 
      AND T1.client = T2.client AND T1.shop = T2.shop 
GROUP BY 
    ISNULL(T1.date, DATEADD(MONTH,1,T2.date)) ,ISNULL(T2.shop,T1.shop) 
ORDER BY [date], shop 
+0

对不起,但它无法正常工作。 –

+0

问题是什么?我用第一个和第二个样本数据对它进行了测试,并且它们都返回了正确的结果。唯一的问题是它会在最大日期之后返回额外的日行。但它可以很容易地过滤。 –

+0

而不是MONTH(T1.date) - 1 = MONTH(T2。[date])它应该是 DATEDIFF(MONTH,T1.date,T2。[date])= -1但是我应该举另一个例子。通过这种修改,它可以完美运行Thans! –