Sql 使用内部联接检索记录
我的任务是获取所有在“2012-09-30”之前和“2013-09-30”之后收到订单的客户的名字、中间名和姓氏。我使用AdventureWorks2017作为示例数据库 表:Sales.SalesOrderHeaderSql 使用内部联接检索记录,sql,sql-server,Sql,Sql Server,我的任务是获取所有在“2012-09-30”之前和“2013-09-30”之后收到订单的客户的名字、中间名和姓氏。我使用AdventureWorks2017作为示例数据库 表:Sales.SalesOrderHeader [SalesOrderID] ,[RevisionNumber] ,[OrderDate] ,[DueDate] ,[ShipDate] ,[Status] ,[OnlineOrderFlag]
[SalesOrderID]
,[RevisionNumber]
,[OrderDate]
,[DueDate]
,[ShipDate]
,[Status]
,[OnlineOrderFlag]
,[SalesOrderNumber]
,[PurchaseOrderNumber]
,[AccountNumber]
,[CustomerID]
,[SalesPersonID]
,[TerritoryID]
,[BillToAddressID]
,[ShipToAddressID]
,[ShipMethodID]
,[CreditCardID]
,[CreditCardApprovalCode]
,[CurrencyRateID]
,[SubTotal]
,[TaxAmt]
,[Freight]
,[TotalDue]
,[Comment]
,[rowguid]
,[ModifiedDate]
表:个人。个人
[BusinessEntityID]
,[PersonType]
,[NameStyle]
,[Title]
,[FirstName]
,[MiddleName]
,[LastName]
,[Suffix]
,[EmailPromotion]
,[AdditionalContactInfo]
,[Demographics]
,[rowguid]
,[ModifiedDate]
表:销售额。客户
[CustomerID]
,[PersonID]
,[StoreID]
,[TerritoryID]
,[AccountNumber]
,[rowguid]
,[ModifiedDate]
我的问题
这个建议很好,但它会返回只有一个实例的记录。我现在遇到了一些小麻烦。例如,如果一个人在2012年之前或2013年之后下了2个订单,则仍将显示该订单。我要找的结果是,只有在给定日期之前和之后下了订单的人才会出现。试试这个,我不确定它是否有效。我没有要测试的数据集,但应该可以
SELECT DISTINCT person_table.FirstName,
person_table.MiddleName,
person_table.LastName
FROM Sales.SalesOrderHeader as sales_order_table
inner join Sales.Customer as sales_customer_table
on (sales_customer_table.CustomerID = sales_order_table.CustomerID
inner join Person.Person as person_table
on (person_table.BusinessEntityID = match_result.PersonID)
WHERE sales_order_table.OrderDate NOT BETWEEN '2012-09-30' AND '2013-06-30'
您可以简单地使用下面的命令。此外,您的日期筛选器不正确
SELECT DISTINCT p.FirstName,
p.MiddleName,
p.LastName
FROM Sales.SalesOrderHeader as s
INNER JOIN Sales.Customer as c
ON c.CustomerID = s.CustomerID
INNER JOIN Person.Person as p
ON p.BusinessEntityID = c.PersonID)
WHERE s.OrderDate >= '2012-09-30' <----- add this
AND s.OrderDate <= '2013-06-30' ) ---- and this
我的任务是获取所有在“2012-09-30”之前和“2013-09-30”之后收到订单的客户的名字、中间名和姓氏
一种方法使用聚合:
SELECT p.FirstName, p.MiddleName, p.LastName
FROM person_table p JOIN
Sales.Customer c
ON p.BusinessEntityID = c.PersonID JOIN
Sales.SalesOrderHeader so
ON c.CustomerID = so.Cus tomerID
GROUP BY p.FirstName, p.MiddleName, p.LastName
HAVING MIN(so.OrderDate) < '2020-09-30' AND
MAX(so.OrderDate) >'2013-06-30';
但是,这就是您在查询中使用的内容。我希望person表有一个类似PersonId的id。示意图:从sales JOIN persons JOIN customers组中选择person,按日期为COUNTCASE的人分组,然后1 END>0,日期为COUNTCASE>2013-09-30,然后1 END>0考虑使用FROM子句,其中只有person.person和WHERE子句存在相关子查询。这将避免对DISTINCT的需要。奇怪的是,它不是for,而是BusinessEntityID
SELECT DISTINCT p.FirstName,
p.MiddleName,
p.LastName
FROM Sales.SalesOrderHeader as s
INNER JOIN Sales.Customer as c
ON c.CustomerID = s.CustomerID
INNER JOIN Person.Person as p
ON p.BusinessEntityID = c.PersonID)
WHERE s.OrderDate >= '2012-09-30' <----- add this
AND s.OrderDate <= '2013-06-30' ) ---- and this
SELECT p.FirstName, p.MiddleName, p.LastName
FROM person_table p JOIN
Sales.Customer c
ON p.BusinessEntityID = c.PersonID JOIN
Sales.SalesOrderHeader so
ON c.CustomerID = so.Cus tomerID
GROUP BY p.FirstName, p.MiddleName, p.LastName
HAVING MIN(so.OrderDate) < '2020-09-30' AND
MAX(so.OrderDate) >'2013-06-30';
ON p.BusinessEntityID = c.PersonID