在mysql中进行复杂的列计算以获取每月访问次数

时间:2014-02-06 01:32:14

标签: mysql sql

我有两张看起来像这样的表

客户表

first last cust_id  
John Doe 0  
Jane Doe 1  

分类帐表

posted_date cust_id   
2014-01-14  0  
2014-01-20  0  
2013-12-20  0  
2013-12-20  1  
2013-11-12  1  
2013-11-10  1

我需要计算客户至少发布一次交易的月数,这在过去的12个月中被称为CustomerMonths。这意味着每个cust_id的CustomerMonths都在0到12之间。所以对于这个数据,我希望看到

cust_id CustomerMonths  
0 2  
1 2

这是因为cust_id 0在2014年1月至少一次,至少在2013年12月一次 同样,cust_id 1在2013年12月至少一次,2013年11月至少一次 对于cust_id 0的示例:

2014-01-14,  
2014-01-20 = 1 CustomerMonths  
2013-12-20 = 1 CustomerMonths  

因此,cust_id 0的过去12个月的总CustomerMonth为2。

我有一个月的工作,但不知道如何让这个工作在过去12个月。虽然我已经满足于它在过去两个月的工作。我想我可以弄清楚其余部分。这就是我所拥有的。

select distinct 
    c.cust_id,
    (case when count(lJan.posted_date) = 0 then 0 else
     case when count(lJan.posted_date) > 0 then 1 end end) as CustomerMonths
from 'customer' c
left join 'ledger' lJan on (lJan.cust_id = c.cust_id and lJan.posted_date between '2014-01-01' and '2014-01-31')
group by c.cust_id

1 个答案:

答案 0 :(得分:0)

您需要计算不同的月份,因此请使用count(distinct)。问题是论证是什么。试试这个:

select c.cust_id,
       count(distinct year(l.posted_date) * 100 + month(l.posted_date)) as CustomerMonths
from customer c left join
     ledger l
     on l.cust_id = c.cust_id and
        l.posted_date between '2013-01-01' and '2014-01-31'
group by c.cust_id;

撰写select的另一种方式:

select c.cust_id,
       count(distinct date_format(l.posted_date, '%Y-%m')) as CustomerMonths