2013-07-01 3 views
0

это может быть легко для всех экспертов SQL ... У меня есть БД с 3 основными таблицами и хотел бы присоединиться к двум подробным таблицам с другой суммой наборы результатов. Смотрите подробности ниже ...Справка по запросу T-SQL: объединение двух разных таблиц подробностей

Customer 
------------- 
ID 
NAME 
... 

Projects 
------------- 
ID 
CustomerID 
ProjectName 
ProjectStatus 
... 

Orders 
------------- 
ID 
CusomterID 
OrderDate 
... 

Теперь я хотел бы сделать запрос, который возвращает все клиенты, которые имеют открытые проекты (1 или более) и их последние 5 заказов, сгруппированных клиентом.

Результат может выглядеть следующим образом

Customer1 
Project Build website 
Project Do SEO 
Orders: 
2013-04-13 10.000$ 
2012-01-20 5.000$ 
2011-10-11 2.000$ 

Customer2 
Project update system 

Orders: 
2012-01-20 5.000$ 
2011-10-11 2.000$ 

.... and so on 

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

Или было бы лучше запускать отдельные запросы?

Я использую T-SQL с SERVER 2008R2.

Может быть, я просто думаю, чтобы сложная, но любая помощь будет фантастическим ...

+0

Есть ли причина, вы не хотите, чтобы сделать это в службах Reporting Services? –

+0

Как связаны таблицы проектов и заказов? Я не вижу соответствующих столбцов. – Justin

+0

@Justin: Они не (кроме Клиента) - * «Заказы и проекты не имеют отношения» *. –

ответ

0

Что-то вроде этого:

SELECT c.NAME, 
     p.ProjectName, 
     o.* 
FROM Customer c 
LEFT JOIN Projects p 
    ON p.CustomerID = c.ID 
LEFT JOIN Orders o 
    ON o.CusomterID = c.ID 
WHERE p.ProjectStatus = 'Open' 
AND o.ID IN (SELECT TOP 5 o2.ID 
      FROM Orders o2 
      WHERE o2.CusomterID = c.ID 
      ORDER BY o2.OrderDate Desc) 
0

Форматирование вывода (такие вопросы, как заголовки клиентов, раздел проекта рубриках , заголовки разделов заказов и т. д.) лучше всего обрабатывать на прикладном уровне (например, в отчетах SSRS, ASP и т. д.).

Вы можете вернуть все данные требуется в одном запросе, как это:

select c.NAME CustomerName, sq.* 
from Customers c 
join (select CustomerID, ID ProjectID, ProjectName, ProjectStatus, 
      'Projects' RecType, null OrderID, null OrderDate, null OrderValue 
     from Projects 
     union all 
     select CustomerID, null ProjectID, null ProjectName, null ProjectStatus, 
      'Orders' RecType, ID OrderID, OrderDate, OrderValue 
     from Orders) sq 
    on c.ID = sq.CustomerID 
order by sq.CustomerID, sq.RecType desc, sq.ProjectID, sq.OrderID 
Смежные вопросы