【问题标题】:SQL (Subqueries)SQL(子查询)
【发布时间】:2017-01-10 11:37:18
【问题描述】:

努力通过我想运行的 SQL 查询进行额外的步骤。

我有一个客户数据库,其中有一个客户表,其中包含客户加入的日期/时间详细信息,以及一个交易表,其中包含他们多年来的交易详细信息

我想做的是按加入日期(作为年份)分组并计算每年加入的人数,然后在下一列中我想计算在特定交易中进行交易的人数年份2016 年。通过这种方式,我可以展示多年来的客户保留率。

两个表都由一个客户 URN 链接,但我正在努力寻找最有效的方式来展示这一点。我可以轻松地按加入年份对成员进行计数和分组,并且可以显示最大日期交易,但我正在努力将两者结合在一起。我想我需要使用子查询和左连接,但它暗指我。

带有数据的示例输出列标题

Year_Joined = 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

【问题讨论】:

  • 您的输出中只需要一年吗?
  • 是的,理想情况下。我希望客户加入的年份,然后是当年加入的人数,然后是当年加入但他们在 2016 年进行交易的相同客户的计数。最终,我想将其显示为保留百分比。例如。 2015 年 35% 的客户在 2016 年进行了交易,以此类推。

标签: sql sql-server-2008


【解决方案1】:

最好的方法是在进行连接之前进行聚合。你想计算两个不同的东西,所以分别计算它们并将它们组合起来。

以下使用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;

【讨论】:

  • 嗨。谢谢,我喜欢这种方法,并没有真正使用过合并,所以很方便看到它在使用中。但是,我需要交易表中的客户数量,而不是所进行交易的数量(尽管您提供的内容很有用)。虽然它非常接近,但我认为我可以根据自己的需要进行调整。如果您确实想出对答案的修改,那么我仍然很高兴受到启发。
  • @MikeRobson 。 . .也许您在该子查询中想要 count(distinct URNCustomer) 而不是 count(*)
【解决方案2】:

你可能想尝试这样的事情:

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)

【讨论】:

  • 这很有效,而且似乎比合并更容易理解,但我会考虑在哪里也可以应用其他答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多