SQL从日期范围内的同一个表中获取不同记录中的几个项目的总和(ORACLE)

时间:2016-12-19 17:12:20

标签: sql oracle

我有一个架构如下。我想运行以下查询:

获取所有资产,描述,总成本(来自资产表),其驱动程序,其类别,经理(来自资产规范)和(所有增量的总和)作为日期范围内的使用情况可以指定。例如,我们可以在2015年11月2日到2016年1月30日之间指定,我们应该得到delta的总和作为用法,这样记录就像这样

ASSETNUM|LOCATION|DESCRIPTION|TOTALCOST|DRIVER|POLCLASS|MANAGER|USAGE
----------------------------------------------------------------------
12345   | HERE   | SEDAN     |30000    |JOHN  | SPORT  | JOE   | 828(300+78+450) 
99999   |  .     | ......................................... 



ASSET:

ASSETNUM | LOCATION | DESCRIPTION | TOTALCOST
---------------------------------------------
12345    | HERE     | SEDAN       |30000    
99999    | THERE    | SUV         |50000
.        | .        |.            |.


ASSETSPEC:

ASSETNUM | ASSETATTRID | ALNVALUE  
---------------------------------
12345    | DRIVER      | JOHN    
12345    | POLCALSS    | SPORT           
12345    | MANAGER     | JOE           
99999    | DRIVER      | Greg  
99999    | POLCLASS    | SPORT 
99999    | .           | . 

METERREADING:

ASSETNUM | DELTA       | Reading Date  
---------------------------------
12345    | 78          | 1/30/2016      
12345    | 450         | 12/9/2015   
12345    | 300         | 11/2/2015

我想一遍又一遍地加入这个表来获得驱动程序,经理和polclass,但我无法弄清楚如何在日期范围内获得delta的总和。这是我的查询的样子

SELECT V.ASSETNUM,
  drivers.ALNVALUE AS Driver,
  manager.ALNVALUE AS Manager,
  V.DESCRIPTION    AS ASSET_DESC,
  V.LOCATION,
  MAXIMO.LOCATIONS.DESCRIPTION AS Location_description,
  V.TOTALCOST,
  polclass.ALNVALUE AS POLICY_CLASS,
FROM MAXIMO.ASSET V
INNER JOIN MAXIMO.ASSETSPEC drivers
ON V.ASSETNUM           = drivers.ASSETNUM
AND drivers.ASSETATTRID = 'DRIVER'
INNER JOIN MAXIMO.ASSETSPEC polclass
ON V.ASSETNUM            = polclass.ASSETNUM
AND polclass.ASSETATTRID = 'POLCLASS'
INNER JOIN MAXIMO.ASSETSPEC manager
ON V.ASSETNUM           = manager.ASSETNUM
AND manager.ASSETATTRID = 'MANAGER'
INNER JOIN MAXIMO.LOCATIONS
ON MAXIMO.LOCATIONS.LOCATION = V.LOCATION
INNER JOIN MAXIMO.METERREADING
ON MAXIMO.METERREADING.ASSETNUM = V.ASSETNUM

1 个答案:

答案 0 :(得分:1)

试试这个:

select assetnum,location,
    description,totalcost,
    manager,polcalss,driver,
    sum(delta) total_delta from
(select * from (
    select a.assetnum, 
    a.location, 
    a.description, 
    a.totalcost, 
    b.assetattrid, 
    b.alnvalue, 
    m.delta
from asset a inner join assetspec b on a.assetnum = b.assetnum
    inner join meterreading m on a.assetnum = m.assetnum
where m.reading_date between 
    to_date('1/30/2015','mm/dd/yyyy') 
    and to_date('1/30/2016','mm/dd/yyyy')
)
pivot
    (max(alnvalue) for 
    (assetattrid) in ('manager' as manager,
        'polcalss' as polcalss, 
        'driver' as driver))
)
group by assetnum,location,description,
totalcost,manager,polcalss,driver;