SQL选择帮助 - 谁今年支付但是不活动

时间:2014-07-11 17:41:02

标签: sql sql-server select

我有一张表,其中的客户是活跃的还是非活跃的。 不活动的是超过1年没有任何付款的人。我需要知道今年第一学期有多少非活动人员活跃起来。

我只有一张表格:" costumer id,支付金额,支付日期,状态"

我尝试过这样的事情:

select DISTINCT COSTUMER_ID 
from finance 
where (DATEPAID >= '2014-01-01' 
    and DATEPAID < '2014-07-01') 
and COSTUMER_ID in (
    select COSTUMER_ID 
    from finance 
    where DATEPAID < '2013-07-01'
)

第一部分是看今年谁支付了谁,第二部分,谁在生命中至少支付了一次。但是不能继续下去。有什么帮助吗?

示例数据:

costumer_id amount paid date paid    todaystatus
  1         50        2012-02-03       inactive
  1         75        2013-02-03       inactive
  2         10        2013-01-02       active
  2         12        2014-04-02       active
  3         65        2014-06-02       active
  4         10        2011-01-06       active
  4         30        2014-04-16       active

客户2和4是我想要的。 2在2014-01-02变得不活跃,但在2014-04-02重新激活 4在2012-01-06变得不活跃,但在2014-04-16重新启动

输出可以是costumer_id

的列表

由于

3 个答案:

答案 0 :(得分:2)

试试这个,并在SQLfiddle中添加一些数据样本来调整此查询。

select DISTINCT f1.COSTUMER_ID 
from finance f1
where (DATEPAID >= '2014-01-01' 
    and DATEPAID < '2014-07-01') 
and datediff(d, (
    select top 1 f2.DATEPAID
    from finance  f2
    where DATEPAID <> f1.DATEPAID
    and f1.COSTUMER_ID=f2.COSTUMER_ID
    order by f2.DATEPAID desc)
    ,f1.DATEPAID)>365

答案 1 :(得分:0)

您希望查看当前处于非活动状态的客户支付的最长日期。这似乎实现了您的业务规则:

select CUSTUMER_ID, max(DATEPAID) as maxdp
from finance 
group by CUSTUMER_ID
having maxdp < '2013-07-01';

请注意,我将COSTOMERID更改为CUSTOMERID,这是更好的英文拼写。

答案 2 :(得分:0)

如果您定义&#34;非活动&#34;这样:

  

不活跃的是超过1年而没有任何付款的人。

你想知道:

  

今年第一学期有多少非活动变为活跃

回答这个问题的唯一方法是财务表是存储每笔交易,而不仅仅是余额。如果这是发生的事情,并根据示例数据,查询如下所示:

SELECT f1.CustomerID
FROM Finance f1
INNER JOIN Finance f2 
     ON f2.CustomerID = f1.CustomerID 
         AND f2.DatePaid = 
               (
                  SELECT TOP 1 DatePaid 
                  FROM Finance f
                  WHERE f.CustomerID = f1.CustomerID and f1.DatePaid < f1.DatePaid
                  ORDER BY DatePaid DESC
                )
          AND f2.DatePaid <= DATEADD(year, -1, f1.DatePaid
WHERE f1.DatePaid >= '2014-01-01' and f1.DatePaid < '2014-07-01'

技巧是将表连接到自身,以便在一个记录中包含当前事务和先前事务。然后,您可以轻松选择所需的记录。

如果你有Sql Server 2012,你可以使用new LAG keyword使这个更多更简单,而且可能更快:

SELECT CustomerID
FROM Finance
WHERE DatePaid >= '2014-01-01' and DatePaid < '2014-07-01'
    AND DATEADD(year, -1, DatePaid) > LAG(DateAdd) 
                                      OVER (PARTITION BY CustomerID 
                                            ORDER BY CustomerID, DatePaid DESC)
ORDER BY CustomerID