Получение записей с внутренними соединениями - PullRequest
0 голосов
/ 19 июня 2020

Моя задача - получить имя, отчество и фамилию для всех клиентов, у которых был заказ до '2012-09-30' и после '2013-09-30'. Я использую AdventureWorks2017 в качестве образца базы данных

Таблица: Sales.SalesOrderHeader

[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]

Таблица: Person.Person

[BusinessEntityID]
      ,[PersonType]
      ,[NameStyle]
      ,[Title]
      ,[FirstName]
      ,[MiddleName]
      ,[LastName]
      ,[Suffix]
      ,[EmailPromotion]
      ,[AdditionalContactInfo]
      ,[Demographics]
      ,[rowguid]
      ,[ModifiedDate]

Таблица: Sales.Customers

[CustomerID]
      ,[PersonID]
      ,[StoreID]
      ,[TerritoryID]
      ,[AccountNumber]
      ,[rowguid]
      ,[ModifiedDate]

My Query

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
    and sales_order_table.OrderDate <= '2012-09-30' )
inner join Sales.Customer as sales_customer_table2
on (sales_customer_table2.CustomerID = sales_order_table.CustomerID
    and sales_order_table.OrderDate >= '2013-06-30' )
inner join Sales.Customer as match_result
on (match_result.CustomerID = sales_customer_table2.CustomerID)
inner join Person.Person as person_table
on (person_table.BusinessEntityID = match_result.PersonID)

В этом текущем состоянии строки не возвращаются, и я не уверен, где проблема

[ОБНОВЛЕНИЕ ]

Нашел относительно хорошее решение проблемы, отредактировав ответ Билала Факиха

SELECT DISTINCT person_table.FirstName,
  person_table.MiddleName, 
  person_table.LastName,
  count(*) as Total_Instanses
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 = sales_customer_table.PersonID)
WHERE sales_order_table.OrderDate NOT BETWEEN '2012-09-30' AND '2013-06-30'
GROUP BY person_table.FirstName,
  person_table.MiddleName, 
  person_table.LastName
HAVING count(*) >= 2

Предложение было хорошим, но оно вернуло записи, в которых был только один экземпляр. Я сейчас сталкиваюсь с несколькими угловыми случаями. Например, если человек сделал 2 заказа, которые были сделаны до 2012 или после 2013 года, все равно будут отображаться. Я ищу результат, чтобы человек появлялся только тогда, когда он делал заказы до И после указанных дат

Ответы [ 3 ]

2 голосов
/ 19 июня 2020

Попробуйте, я не уверен, работает ли это, у меня нет набора данных для тестирования, но он должен

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'
0 голосов
/ 19 июня 2020

Мое задание - получить имя, отчество и фамилию для всех клиентов, у которых был заказ до '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';

Я скажу, что это условие выглядит подозрительно:

ON p.BusinessEntityID = c.PersonID

Однако это то, что вы используете в своей запрос. Я ожидал бы, что таблица людей будет иметь идентификатор, называемый что-то вроде PersonId.

0 голосов
/ 19 июня 2020

Вы можете просто использовать это ниже. Также ваш фильтр дат был неправильным.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...