SQL - 从同一个表中获取两次数据

时间:2015-03-24 11:16:49

标签: sql sql-server-2008

互联网上的好人,我需要你的帮助!

我试图整理一些SQL代码来创建报告。基本上,我需要查看一个表 - tbl_Schedules - 并获取字段SchedDone的最大值,这是一个常规日期字段。

这很公平。我使用GROUP BY和MAX来管理它。

同一个表格还包含SchedFrom和SchedTo字段,我需要从另一条记录中获取此字段,但与此一起运行。

基本上,我需要一个" LatestDate"字段(显示最大SchedDone),然后是"下一个预定的"字段(或字段),显示接下来要完成的时间,从SchedDone为空的行中提取。

我当前的代码,显示如下(忽略除了tbl_Schedules之外的所有东西)正在发挥作用。它显示了如上所述的LatestDate,但也显示了该任务的SchedFrom和SchedTo的最大值。这些都来自tbl_Schedules中的不同行,这就是我想要的。我只需要知道如何为SchedFrom和SchedTo设置规则,最好不涉及任何其他表或设置多个视图。

我确实有这个工作,但它采取了几种观点,所涉及的速度并不好。我希望我可以在一小段SQL代码中使用它。

PS - tbl_PhysicalAssets是与tbl_Operations的一对多关系(tbl_PhysicalAssets中的一行与tbl_Operations中的许多行),tbl_Operations是与tbl_Schedules的一对多关系(tbl_Operations中的一行与tbl_Schedules中的许多行相关)。

下面的当前代码(再次请忽略其他表格!) -

SELECT     
   dbo.tbl_PhysicalAsset.FKID_Contract, 
   dbo.tbl_PhysicalAsset.MyLevel, 
   dbo.tbl_PhysicalAsset.L1_Name, 
   dbo.tbl_PhysicalAsset.L2_Name, 
   dbo.tbl_PhysicalAsset.L3_Name, 
   dbo.tbl_OpList.Operation_Name, 
   dbo.tbl_Teams.Team_Name, 
   MAX(tbl_Schedules_1.SchedDone) AS LatestDate, 
   MAX(tbl_Schedules_1.SchedFrom) AS Expr1, 
   MAX(tbl_Schedules_1.SchedTo) AS Expr2
FROM
   dbo.tbl_Schedules AS tbl_Schedules_1 
RIGHT OUTER JOIN
   dbo.tbl_PhysicalAsset 
INNER JOIN
   dbo.tbl_Operations ON dbo.tbl_PhysicalAsset.PKID_PhysicalAsset = dbo.tbl_Operations.FKID_PhysicalAsset 
INNER JOIN
   dbo.tbl_OpList ON dbo.tbl_Operations.FKID_Operation = dbo.tbl_OpList.PKID_Op 
INNER JOIN
   dbo.tbl_Teams ON dbo.tbl_Operations.FKID_Team = dbo.tbl_Teams.PKID_Team ON tbl_Schedules_1.FKID_Operation = dbo.tbl_Operations.PKID_Operation
GROUP BY 
   dbo.tbl_PhysicalAsset.FKID_Contract, 
   dbo.tbl_PhysicalAsset.MyLevel, 
   dbo.tbl_PhysicalAsset.L1_Name, 
   dbo.tbl_PhysicalAsset.L2_Name, 
   dbo.tbl_PhysicalAsset.L3_Name, 
   dbo.tbl_OpList.Operation_Name, 
   dbo.tbl_Teams.Team_Name
HAVING      
   (dbo.tbl_PhysicalAsset.FKID_Contract = 6) 
   AND (dbo.tbl_PhysicalAsset.MyLevel = 3)

1 个答案:

答案 0 :(得分:1)

这很粗糙,因为我们不知道表结构的确切细节。

但基本上你需要首先编写获取两个独立信息的查询,确保它们孤立地工作。然后,您可以将它们连接在一起。

所以(我假设FKID_Operation是'常见的'信息):

select
   a.FKID_Operation
   , b.LatestDate
   , c.NextToDate
   , c.NextFromDate
from tbl_Schedules a

inner join
(
select 
   m.FKID_Operation
   , Max(m.SchedDone) as LatestDate
from tbl_Schedules m
where SchedDone is not null
) b
on a.FKID_Operation = b.FKID_Operation

inner join
(
select
   n.FKID_Operation
   , n.SchedTo as NextToDate
   , n.SchedFrom as NextFromDate
from tbl_Schedules n
where SchedDone is null
) c
on a.FKID_Operation = c.FKID_Operation

我也会研究CTE,因为它们可以使这种查询更容易理解。