查询2个表格问题

时间:2016-05-18 07:28:49

标签: sql-server inner-join

我有两张桌子:

表R5EVENTS:

EVT_CODE     EVT_JOBTYPE       EVT_UDFCHAR05
   1             A                1111
   2             B                2222
   3             A                3333
   4             C                4444

表R5BOOKEDHOURS:

BOO_EVENT     BOO_HOURS     BOO_PERSON
   1             2            ADG
   1             5            POL 
   1             1            TAD
   2             3            POL
   2             4            TAD
   3             2            ADG
   3             5            POL
   4             1            TAD
   4             2            POL
   4             3            ADG

当我运行此查询时:

select 
    EVT_JOBTYPE, COUNT (EVT_CODE), SUM(BOO_HOURS)
from 
    R5BOOKEDHOURS 
inner join 
    R5EVENTS on EVT_CODE = BOO_EVENT 
where 
    BOO_PERSON is not null
group by 
    EVT_JOBTYPE

我明白了:

EVT_JOBTYPE     COUNT(EVT_CODE)     SUM(BOO_HOURS)
    A                  5                  15
    B                  2                  7
    C                  3                  6

我需要的是COUNT(EVT_CODE)只计算工作订单R5EVENTS上的代码,而不是来自R5BOOKEDHOURS,因为每次工作注册一小时就会重复EVT_CODE / BOO_EVENTS。

我想得到:

EVT_JOBTYPE     COUNT(EVT_CODE)     SUM(BOO_HOURS)
    A                  2                 15
    B                  1                 7
    C                  1                 6

UPDATE(上面的表格):

我有另一张价格为R5ORDERLINES的表(R5ORDERLINES.ORL_ORDER = R5EVENTS.EVT_UDFCHAR05)

ORL_PART     ORL_ORDQTY     ORL_PRICE     ORL_ORDER
   AA           5             100           1111 
   BB           2             500           2222
   CC           1             200           3333
   DD           10            2000          4444

我需要获得与一个EVT_ORDER相对应的所有ORL_PRICES的SUM,由EVT_JOBTYPE同时分组,就像我们在第一个查询中一样。

结果:

EVT_JOBTYPE     COUNT(EVT_CODE)     SUM(BOO_HOURS)    ORL_PRICE
    A                  2                 15             300
    B                  1                 7              500
    C                  1                 6              2000    

2 个答案:

答案 0 :(得分:1)

你可以这样做:

select EVT_JOBTYPE,
count(EVT_CODE),
sum(SumBOO_HOURS)
from
(
    select EVT_JOBTYPE,
    EVT_CODE,
    SUM(BOO_HOURS) as SumBOO_HOURS
    from R5BOOKEDHOURS inner join R5EVENTS on EVT_CODE = BOO_EVENT 
    where bh.BOO_PERSON is not null
    group by EVT_JOBTYPE,
    EVT_CODE
) PreGroupedData
group by EVT_JOBTYPE

答案 1 :(得分:0)

您需要有两个不同的数据组才能加入,以实现这一目标。一个简单的方法是:

select e.EVT_JOBTYPE, MAX(EVT_CODE_COUNT) AS EVT_CODE_COUNT, SUM(BOO_HOURS)
from R5BOOKEDHOURS bh
inner join R5EVENTS e on e.EVT_CODE = bh.BOO_EVENT 
inner join (SELECT EVT_JOBTYPE, COUNT(*) AS EVT_CODE_COUNT FROM R5EVENTS GROUP BY EVT_JOBTYPE) temp on temp.EVT_JOBTYPE = e.EVT_JOBTYPE
where bh.BOO_PERSON is not null
group by e.EVT_JOBTYPE

更好的优化方法是首先创建一个#temp表,然后点击加入它。

相关问题