【问题标题】:SQL Query for all purchases in a given monthSQL查询给定月份的所有购买
【发布时间】:2016-03-01 17:08:44
【问题描述】:

我正在阅读 SQL 教程,并遇到了这个问题。 我被卡住了一段时间。

客户

id INTEGER PRIMARY KEY    
lastname VARCHAR    
firstname VARCHAR

购买

id INTEGER PRIMARY KEY    
customers_id INTEGER FOREIGN KEY customers(id)    
purchasedate DATETIME    
purchaseamount REAL

Write a statement that gives a list of all customers who purchases something this month.

我知道我想对 customer_id 上的表进行内部连接,然后获取月份为 2 月的客户名称,这看起来对吗?

SELECT * from Purchases
    inner join Customers
    on Purchases.customers_id=Customers.id
WHERE MONTH(purchasedate) = 2

【问题讨论】:

  • 你需要考虑到每年都有第二个月。
  • 请注意。这将是回头客。您只需要显示不同的customers.id。
  • 您将purchasedate 列为整数,假设这是一个错字,应该是datetime
  • @Kritner 你是正确的,固定的。

标签: sql


【解决方案1】:

是的,或者为了避免你可以写的整个 distinct 业务

SELECT id, LastName, firstname FROM Customers
WHERE EXISTS ( SELECT 1 FROM Purchases 
               WHERE customers_id=Customers.id
               AND MONTH(purchasedate)=2 AND YEAR(purchasedate)=2016 )

【讨论】:

  • 值得注意的是,您认识到年份的重要性。
【解决方案2】:

我会选择EXISTS,这样可以避免重复

SELECT Customers.id,
       Customers.LastName,
       Customers.firstname
FROM   Customers
WHERE  EXISTS (SELECT 1
               FROM   Purchases
               WHERE  Purchases.customers_id = Customers.id
                      AND Month(purchasedate) = 2) 

考虑到您想要提取在任何一年的2 月份购买的客户信息

【讨论】:

  • 您选择了 Customers.id,@cars10 选择了 id,没有客户前缀。这些有区别吗?
  • @NorCalKnockOut - 零差异
【解决方案3】:

您的查询将返回一个名称重复的列表。只需添加DISTINCT

不要使用*,只需包含您需要的字段即可。

还包括id,以防两个人的名字和姓氏相同

SELECT DISTINCT Customers.id, Customers.LastName, Customers.firstname 
from Purchases
inner join Customers
  on Purchases.customers_id = Customers.id
WHERE MONTH(purchasedate) = 2

如果您只想要当前月份的销售额。您需要指定您的 RDBMS,因为日期函数不同。

例如在 postgres sql 中你可以使用 Get first date of month in postgres

SELECT DISTINCT Customers.id, Customers.LastName, Customers.firstname 
from Purchases
inner join Customers
  on Purchases.customers_id = Customers.id
WHERE date_trunc('month', current_date) = date_trunc('month', purchasedate) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多