0

对于所有 SQL 专家来说,这可能是一个简单的问题......我有一个包含 3 个主表的数据库,并且想加入两个具有不同结果集总和的详细表。请参阅下面的详细信息...

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

所以订单和项目没有关系,它们的行数不一定相同。这是我坚持的地方,因为查询只返回一个包含所有子查询总和的表。

还是单独运行查询会更好?

我正在使用带有 SERVER 2008R2 的 T-SQL。

也许我只是想复杂一点,但任何帮助都会很棒......

4

2 回答 2

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
于 2013-07-01T13:27:47.720 回答
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)
于 2013-07-01T13:09:38.763 回答