2013-01-04 26 views
0

我有两个表 - 一个用于Jobs,另一个用于Connections。一份工作可以有很多联系。 Connetion的PK是connid +时间戳,它有一个指向Job的JOBID的外键(JOBID)。如何从多个表中查询数据和信息的范围SQL?

JOBID | NAME 
-------+------- 
    id1 | Name of Job 1 
    id2 | Job 2's Name 

CONNID | TIMESTAMP | JOBID | AMOUNT 
-------+-------+--------+---------- 
012 | doesn't | id1 | 11 
012 | matter | id1 | 15 
012 |   | id1 | 20 
012 |   | id1 | 30 
020 |   | id1 | 2 
020 |   | id1 | 5 
549 |   | id2 | 19 
549 |   | id2 | 30 
549 |   | id2 | 50 
549 |   | id2 | 57 
549 |   | id2 | 60 

所以我想要做的是,从连接表中,获取每个作业的每个连接的范围的总和。所以对于job-id1我想(30-11)+(5-2)这是22和我想要的job-id2(60-19)这是41.现在我可以弄清楚如何做最大减去最小值每个连接...

SELECT 
    CONNID , 
    MAX(AMOUNT) - MIN(AMOUNT) AS range 
FROM Connection 
GROUP BY CONNID 

...但我不与SQL非常熟悉,找出更多我需要什么(如我在大学的单一数据库类年前了)。除此之外,我希望它按照工作名称排序,我相信我必须从Job表中获得一个完整的“复杂化层”。

基本上,我想要的结果集看起来像

NAME   | range 
--------------+------ 
Name of Job 1 | 22 
Job 2's Name | 41 

最后,我希望能够为仅过去24小时内做到这一点,但只应增加一个WHERE在那里应该是非常简单的条款。

我希望的答案将包含一个查询,只是一个JOBID连接表查询(所以不担心作业的名称为答案的第一部分),然后查询,我' m实际上是在寻找那个给了我上面的结果集,所以我可以明确地看到需要达到的额外步骤。

回答

2

你的想法是沿着正确的轨道,你只需要走得更远。

第一组需要通过连接和工作。这为您获得每个工作的个人范围。然后你想在连接层把它们组合在一起。

select connid, SUM(range) as range 
from (SELECT CONNID, jobid, MAX(AMOUNT) - MIN(AMOUNT) AS range 
     FROM Connection 
     GROUP BY CONNID, jobid 
    ) cj 
group by connid 

如果你想要一份工作的总时间和由工作名称进行排序,那么你可以试试:你可以用一个子查询做到这一点

select jobname, SUM(range) as range 
from (SELECT CONNID, jobid, MAX(AMOUNT) - MIN(AMOUNT) AS range 
     FROM Connection 
     GROUP BY CONNID, jobid 
    ) cj join 
    job j 
    on j.jobid = cj.jobid 
group by jobname 

此总结了工作连接来获取范围,然后添加。

+0

看起来我们发布了同样的答案,所以它必须是正确的;)只是抬起头,最终的分组他想通过JOBID而不是CONNID。所以你认为最后一个GROUP ON应该切换到'group by jobid'。 OP:如果你同意,那么你可以接受这个答案,因为他把它发布在我面前。 –

+0

@EliGassert。 。 。问题的文字强烈表明答案应该以连接的方式。我确实承认样本结果是由工作提出的,但我会继续与之联系。 –

+0

你确定吗? *所以对于工作id1我想(30-11)+(5-2)这是22和工作id2我想(60-19)这是41. *我读到,因为他想他的结果是在表单'jobid |时间' –

1

你很近。这是两次进站的过程:

  1. 获取每个CONNID + JOBID
  2. 最大/最小然后得到最小值/最大值为每CONNID + JOBID的总和每个JOBID

所以步骤1:

SELECT 
    CONNID, JOBID 
    MAX(AMOUNT) - MIN(AMOUNT) AS Range1 
FROM Connection 
GROUP BY CONNID, JOBID 

然后步骤2正在第1步中的resutls和进一步聚合它

SELECT JOBID, SUM([Range]) AS [Range] 
FROM 
(
    SELECT 
     CONNID, JOBID 
     MAX(AMOUNT) - MIN(AMOUNT) AS [Range] 
    FROM Connection 
    GROUP BY CONNID, JOBID 
) AS t0 
GROUP BY JOBID 
+0

很好的答案,仍然有帮助。不过,我选择了戈登,因为我想让他们按工作名称分组。 – claudekennilol

+0

听起来不错。我在与戈登讨论如何分组。我想我错了:) –

0

如果你想仔细分解的理解,我用一个临时表进行分类汇总

SELECT 
     JOBID 
     , CONNID 
     , MAX(AMOUNT) - MIN(AMOUNT) AS range 
     into #subtotal 
    FROM Connection 
    --Where timestamp between "low" and "high" 
    GROUP BY JOBID, CONNID 

    select * from #subtotal 

    Select job.Name 
      , sum(range) as range 
    from #subtotal inner join job on job.jobid = #subtotal.jobid 
    group by job.Name 

    drop table #subtotal