繁体   English   中英

SQL(子查询)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM