SQL - 如果至少有一个事务处于今天,则计算事务数

时间:2017-07-21 15:05:57

标签: sql date count multiple-tables

我有一个客户交易数据库,每个交易都有一个特定的日期。如果客户今天进行了交易,我需要计算过去两个月内每个客户的交易数量。

我一直在想,它需要我使用WHERE设置两个月的完整范围和另一个HAVING语句,以确保最新日期(客户交易的最大值)等于今天的日期,但我似乎无法让它发挥作用。这听起来像是解决这个问题的正确方法还是有更好的方法?

谢谢!

4 个答案:

答案 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