Нужна помощь в создании запроса для ненормализованной базы данных - PullRequest
0 голосов
/ 14 ноября 2011

Я никогда раньше не работал с ненормализованной базой данных, поэтому я постараюсь объяснить свою проблему как можно лучше.Итак, у меня есть две таблицы:

enter image description here

Таблица клиентов содержит всю информацию о клиентах, а таблица заказов содержит все размещенные заказы.Я не перечислил все поля в таблицах, только те, которые мне нужны.Номер клиента в обеих таблицах не является первичным ключом, но я все равно присоединяюсь к ним.Таким образом, проблема у меня заключается в том, что я не знаю, как сделать запрос, который:

Выбирает всех клиентов по имени, фамилии и электронной почте, а также показывает самую последнюю дату заказа,самый последний итог и самый последний тип заказа.Я знаю, что мне нужно использовать агрегат max () для даты, но это насколько я понял.Пожалуйста, помогите новичку.

Ответы [ 4 ]

3 голосов
/ 14 ноября 2011

Вы можете попробовать:

SELECT FirstName,
       LastName,
       Email,
       OrderDate,
       OrderTotal,
       OrderType

FROM Customers AS C
INNER JOIN Order AS O
  ON O.CustomerNumber = C.CustomerNumber AND
     O.OrderDate = (
                    SELECT MAX (O1.OrderDate)
                    FROM Order AS O1
                    WHERE O1.CustomerNumber = C.CustomerNumber)
                   )
2 голосов
/ 14 ноября 2011

при условии, что Orders.OrderDate уникален для каждого CustomerNumber, это работает для вас? если в одном CustomerNumber есть несколько записей в Order для OrderDate, вы получите каждую из этих строк.

select c.FirstName, c.LastName, c.Email, o.OrderDate, o.OrderTotal, o.OrderType
from Customers c
join
(select CusomterNumber, max(OrderDate) as MostRecentOrderDate
 from Orders
 group by CustomerNumber
) mro on mro.CustomerNumber=s.CustomerNumber
join Orders o on o.OrderDate=mro.MostRecentOrdeDate and
                 o.CustomerNumber=mro.CustomerNumber
0 голосов
/ 14 ноября 2011

Если вы делаете это с SQL Server, используйте конструктор запросов, и в основном все, что вам нужно сделать, это выполнить объединение, поскольку у вас есть два одинаковых ключа в таблице клиентов -> Объединение клиентов по заказу -> Псевдоним клиентаТаблица клиентов как C и Таблица заказов как O

, например,

SELECT Customer.*, Orders.* 
From Customer c, Orders O INNER JOIN O where C.Customer Number = O.Customer Number 

Этого должно быть достаточно, чтобы начать работу ... если вы не хотите, чтобы все поля были полностью квалифицированы,имена например

SELECT C.FirstName, C.LastName, O.OrderDate, O.OrderType FROM Customer C, Orders O 
WHERE C.Customer NUmber = O.Customer Number //this is another way of doing a Join when working with the where Clause.
0 голосов
/ 14 ноября 2011

Попробуйте это:

SELECT
 Customers.*, Orders.*
FROM
 Customers
JOIN 
 (SELECT
   Customer_Number,
   MAX(Order_Date) OrderDate
  FROM
   Orders
  GROUP BY 
   Customer_Number
) as Ord ON Customers.Customer_Number = Ord.Customer_Number
JOIN Order ON Orders.Customer_Number = Ord.Customer_Number
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...