[英]SQL (Subqueries)
努力通过我想运行的SQL查询执行额外的步骤。
我有一个客户数据库,其中有一个客户表,其中包含客户加入的日期/时间详细信息,以及一个交易表,其中包含其当年的交易详细信息
我想做的是按加入日期(以年为单位)分组并计算每年加入的人数,然后在下一列中我想计算在特定年份进行交易的人数(例如2016年)本年度。 这样,我可以显示多年来的客户保留率。
这两个表都是由客户URN链接的,但是我一直在努力以最有效的方式来证明这一点。 我可以轻松地按加入年份对成员进行计数和分组,并且可以显示最大日期的交易,但是我很难将两者合并在一起。 我想我需要使用子查询和左连接,但这暗示了我。
带有数据的示例输出列标题
年加入= 2009
Joiner_Count = 10
Transact_in_2016 = 5
我在语法方面。 我知道这还远远没有完成。 因为我需要按DateJoined分组,然后再子查询2016年已交易的客户数?
SELECT Customer.URNCustomer,
MAX(YEAR(Customer.DateJoined)),
MAX(YEAR(Tran.TranDate)) As Latest_Tran,
FROM Mydatabase.dbo.Customer
LEFT JOIN Mydatabase.dbo.Tran
ON Tran.URNCustomer = Customer.URNCustomer
GROUP BY Customer.URNCustomer
ORDER BY Customer.URNCustomer
最好的方法是在进行联接之前进行聚合。 您想计算两个不同的事物,因此要分别计算并结合起来。
以下使用full outer join
。 这可以处理以下情况:没有新客户的年份和没有交易的年份:
select coalesce(c.yyyy, t.yyyy) as yyyy,
coalesce(c.numcustomers, 0) as numcustomers,
coalesce(t.numtransactions, 0) as numtransactions
from (select year(c.datejoined) as yyyy, count(*) as numcustomers
from Mydatabase.dbo.Customer c
group by year(c.datejoined)
) c full outer join
(select year(t.trandate) as yyyy, count(*) as numtransactions
from database.dbo.Tran t
group by year(t.trandate)
) t
on c.yyyy = t.yyyy;
您可能要尝试这样的事情:
SELECT YEAR(Customer.DateJoined),
COUNT( Customer.URNCustomer ),
COUNT( DISTINCT Tran.URNCustomer ) AS NO_ACTIVE_IN_2016
FROM Mydatabase.dbo.Customer
LEFT Mydatabase.dbo.Tran
ON Tran.URNCustomer = Customer.URNCustomer
AND YEAR(Tran.TranDate) = 2016
GROUP BY YEAR(Customer.DateJoined)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.