【发布时间】:2017-11-15 01:21:42
【问题描述】:
我有两张桌子:
- 人员(BusinessEntityID、FirstName、LastName)
- 销售(OrderID、CustomerID、OrderDate)
我想列出在 2011 年和 2014 年都下过订单但在 2012 年和 2013 年从未下过订单的人
我希望这个查询能够正常工作,但它仍在列出 2013 年的订单
SELECT
s.CustomerID,p.LastName,p.FirstName, s.OrderDate
FROM
Sales.SalesOrderHeader s,Person.Person p
WHERE
s.CustomerID = p.BusinessEntityID
AND s.CustomerID IN (SELECT CustomerID
FROM Sales.SalesOrderHeader
WHERE YEAR(OrderDate) IN (2011, 2014)
GROUP BY CustomerID
HAVING COUNT(CustomerID) > 1)
AND s.CustomerID NOT IN (SELECT CustomerID
FROM Sales.SalesOrderHeader
WHERE YEAR(OrderDate) IN (2012, 2013)
GROUP BY CustomerID
HAVING COUNT(CustomerID) > 1)
GROUP BY
s.CustomerID, p.LastName, p.FirstName, s.OrderDate
结果:
CustomerID LastName FirstName OrderDate
---------------------------------------------------------------
11001 Young Amber 2011-06-17 00:00:00.000
11001 Young Amber 2013-06-18 00:00:00.000
11001 Young Amber 2014-05-12 00:00:00.000
11017 Clark Chloe 2011-06-14 00:00:00.000
11017 Clark Chloe 2013-06-03 00:00:00.000
11017 Clark Chloe 2014-03-16 00:00:00.000
11018 Mehta Joe 2011-06-19 00:00:00.000
11018 Mehta Joe 2013-06-18 00:00:00.000
11018 Mehta Joe 2014-03-26 00:00:00.000
【问题讨论】:
-
将表格和数据发布为文本READ THIS 以了解原因
-
你的 rdbms 是什么? Sql Server、postgres、oracle?
-
你可以使用senseful.github.io/text-table来格式化你的表格
-
您说“我想列出人员”,但您的查询列出了汇总订单。 在开始编写代码之前了解(并正确陈述)您的目标。
-
Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI
JOIN语法-92 SQL 标准(25 年前),不鼓励使用它
标签: sql sql-server