2017-04-18 13 views
1

我有兩個表如下:SQL的一列在逐年分組表返回數的差異(ORACLE)

資產表:

assetnum | depid 
---------------- 
1  | eng 
2  | ap 
3  | cao 
.  | . 
.  | . 
.  | . 

Meterreading表:

assetnum | meterreading_date | reading 
--------------------------------------- 
1  | 4/7/2017   | 50000 
2  | 3/5/17   | 30000 
3  | 1/15/17   | 10000 
.  | .     | . 
.  | .     | . 
.  | .     | . 

我很想做一個連接並獲得每個資產的年度使用量。換句話說,我希望獲得 assetnum,depid(當年記錄的最後一個日期的最後一次讀數 - 當年記錄的第一個日期的第一次讀數)作爲按年份分組的使用情況。

例如在上述情況下,我將有輸出

assetnum | depid | usage 
------------------------- 
1  | eng | 40000 (50000-10000) 
.  | . | . 
.  | . | . 
.  | . | . 
+0

你會加盟嗎? assetnum?我問,因爲基於depid似乎那些assetnum 1和3行是爲不同的值。然而,在示例輸出中,您將它們組合在一起...如果您只是希望從讀數表中獲得「最早」 - 「最新」行之間的差異,則不需要加入。最後一個問題:我想對於讀表來說,關鍵是由assetnum和meterreading_date組成(在同一日期不會有兩個assetnum) - 對嗎? –

回答

2

Tweeking戈登的響應...只是從日期提取年份,然後按組排除其中。

SELECT mr.assetnum 
    , a.depid 
    , max(usage) - min(usage) as usage 
    , to_char(meterreading_date,'YYYY') as Year 
FROM Meterreading mr 
INNER join Asset a 
    on mr.assetnum = a.assetnum 
GROUP BY mr.assetnum, a.depid, to_char(meterreading_date,'YYYY') 

還是......使用提取VS TO_CHAR ...

SELECT mr.assetnum 
    , a.depid 
    , max(usage) - min(usage) as usage 
    , extract(year from meterreading_date) as Year 
FROM Meterreading mr 
INNER join Asset a 
    on mr.assetnum = a.assetnum 
GROUP BY mr.assetnum, a.depid, extract(year from meterreading_date) 

在這兩種情況下,這得到了MIN和每年最多使用,並從最大減去最小。它不是日期驅動的,而是使用/年驅動的。如果由於某種原因,今年晚些時候閱讀量較低,可能不會達到理想的結果......爲了真正實現日期推動,我們需要獲取最小/最大日期,找出這些日期的使用情況,從那裏出發。

實施例,如果讀出爲:

assetnum | meterreading_date | reading 
--------------------------------------- 
1  | 7/5/2017   | 70000 
1  | 6/1/2017   | 10000 
1  | 5/7/2017   | 60000 
1  | 4/7/2017   | 50000 
1  | 3/5/17   | 30000 
1  | 1/15/17   | 20000 

然後使用爲2017年1 assetnum將70000-10000或60000;但也許你想70000-20000 = 50000 ...

2

如果我理解正確的,你只想要一個joingroup by

select mr.assetnum, a.depid, 
     (max(usage) - min(usage)) as usage 
from Meterreading mr join 
    Asset a 
    on mr.assetnum = a.assetnum 
where meterreading_date >= date '2017-01-01 and 
     meterreading_date < '2018-01-01' -- unnecessary for the current year 
group by mr.assetnum, a.depid; 
+0

或者您可以從日期中刪除年份並顯示並分組,並避免where邏輯。 – xQbert

+0

我有從2005年一直到現在的日期,並希望按年分組。 – jax

0

另一個答案逐年分組:

SELECT reading.*, max_reading-min_reading used, depid 
FROM 
    (SELECT TRUNC(meterreading_date,'yyyy') meterreading_date, assetnum, MIN(reading) min_reading, MAX(reading) max_reading 
    FROM METERREADING 
    GROUP BY TRUNC(meterreading_date,'yyyy'), assetnum 
) reading 
    JOIN 
    asset ON asset.assetnum=reading.assetnum