2

我需要列出艺术家的 Id_no、姓氏 (lname) 以及今年在他们的发行版中是如何购买的。有关购买的唯一信息是不同的购买日期。

到目前为止我的代码:

SELECT id_no, lname, purchasedate AS num_ops
FROM Artist JOIN Sales ON Artist.id_no = Sales.artist
WHERE DATE_SUB(CURDATE(),INTERVAL 1 YEAR) <= purchasedate

但是,这只会返回已经进行销售的 Id_no,即使它是 0,我也需要全部。 On distrinctl name,并且num_ops是他们的第一个日期purchasedate。我需要更改此代码以列出他们在今年内参与的购买次数。我试过使用,COUNT(purchasedate)但是这只返回一行。我希望返回表返回:

第 1 列:艺术家的 ID 第
2 列:艺术家的姓氏
第 3 列:购买了他们的 CD 的人数(这是购买的数量)

我主要在第 3 栏上苦苦挣扎,任何帮助都会非常感激。

4

1 回答 1

2

你需要:

  • 连接_
  • 将日期条件移动到ONJOIN 的子句中
  • 使用count(*)聚合函数

像这样:

SELECT id_no, lname, count(purchasedate) as num_ops
FROM Artist
LEFT JOIN Sales ON Artist.id_no = Sales.artist
    AND DATE_SUB(CURDATE(),INTERVAL 1 YEAR) <= purchasedate
GROUP BY id_no, lname
  • LEFT JOIN即使没有销售,这将确保为每位艺术家返回一行
  • 通过将日期条件移动到连接中,即使该年没有销售,仍将为每位艺术家返回一行。如果条件保留在WHERE子句中,则会过滤掉去年没有销售的艺术家。

这里的一个关键点是连接条件可能包含与所涉及的键无关的条件 - 这就是您获得条件连接的方式,这就是您想要让左连接仍然正常工作的方式

于 2012-11-28T00:54:03.360 回答