我有一个客户交易数据库,每个交易都有一个特定的日期。如果客户今天进行了交易,我需要计算过去两个月内每个客户的交易数量。
我一直在想,它需要我使用WHERE设置两个月的完整范围和另一个HAVING语句,以确保最新日期(客户交易的最大值)等于今天的日期,但我似乎无法让它发挥作用。这听起来像是解决这个问题的正确方法还是有更好的方法?
谢谢!
答案 0 :(得分:0)
您可以在WHERE
条款中抛出子查询,以查找今天有销售的客户:
SELECT count(*) /*count of transactions*/
FROM transactions
WHERE
/*Transactions in the last two months*/
transaction_date > DATEADD(mm, -2, GETDATE())
/*For customers that have had a sale today*/
customer_number in (SELECT customer_number FROM transactions WHERE transaction_date = GETDATE());
完全猜测你的表格结构,表格名称和字段名称,但这应该会让你接近。
答案 1 :(得分:0)
或者,您可以尝试进行内部联接:
SELECT t2.CustomerID,count(*) as TransactionsCount
FROM [Tansaction] t1 INNER JOIN [Tansaction] t2
ON t1.CustomerID= t2.CustomerID
WHERE CONVERT(date,t1.TransactionDateTime) = CONVERT(date,GETDATE())
AND t2.TransactionDateTime>= DATEADD(mm, -2, GETDATE())
GROUP BY t2.CustomerID
答案 2 :(得分:0)
首先,您需要获取今天进行交易的客户列表。我假设你有一个'交易表'包含交易日期和客户详细信息。
使用以下方法从此交易表中进行选择:
Select count of distinct(transactiondate), Customer
from Transactiontable
where transactiondate > dateadd(months,-2, getdate())
and customer in (select customer from transactiontable
`where cast(transactiondate as date) = cast(getdate() as date))
答案 3 :(得分:0)
您没有提供有关架构如何的任何信息,但我假设您有一个Customer表和一个Transaction表。考虑这个例子,有4个客户和12个交易。
<强>客户强>
| id | name |
|----|----------|
| 1 | Google |
| 2 | Facebook |
| 3 | Hooli |
| 4 | Yahoo! |
<强>交易强>
| id | transaction_date | customer_id |
|----|------------------|-------------|
| 1 | 2017-04-15 | 1 |
| 2 | 2017-06-24 | 1 |
| 3 | 2017-07-09 | 1 |
| 4 | 2017-07-24 | 1 |
| 5 | 2017-07-23 | 2 |
| 6 | 2017-07-22 | 2 |
| 7 | 2017-07-21 | 2 |
| 8 | 2017-07-24 | 2 |
| 9 | 2017-07-24 | 3 |
| 10 | 2017-07-23 | 4 |
| 11 | 2017-07-22 | 4 |
| 12 | 2017-07-21 | 4 |
要计算每个客户最近两个月的交易数量,一个简单的小组将完成这项工作:
select name, count(*) as number_of_transactions
from transactions t
inner join customers c on c.id = t.customer_id
where t.transaction_date > dateadd(month, -2, getdate())
group by c.name
这会产生
| name | number_of_transactions |
|----------|------------------------|
| Facebook | 4 |
| Google | 3 |
| Hooli | 1 |
| Yahoo! | 3 |
要仅检索具有等于今天的transaction_date的事务的客户,我们可以使用exists来检查是否存在这样的行。
select name, count(*) as number_of_transactions
from transactions t
inner join customers c on c.id = t.customer_id
where t.transaction_date > dateadd(month, -2, getdate())
and exists(select *
from transactions
where customer_id = t.customer_id
and transaction_date = convert(date, getdate()))
group by c.name
因此,如果事务表中的transaction_date等于today且customer_id等于main查询中的customer_id的行将结果包含在内。运行该查询(鉴于7月24日是今天)给出了我们的结果:
| name | number_of_transactions |
|----------|------------------------|
| Facebook | 4 |
| Google | 3 |
| Hooli | 1 |
Check out this sql fiddle http://sqlfiddle.com/#!6/710c94/13