簡體   English   中英

SQL-返回按年份分組的表中的列中的數字差(ORACLE)

[英]SQL- return a difference of number in a column in a table grouped by year (ORACLE)

我有兩個表,如下所示:

資產表:

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

抄表:

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

我正在努力加入並獲得每種資產的年度使用量。 換句話說,我想獲取資產編號depid(按當年使用情況分組)(該年記錄的最后日期的最后一次讀數-該年記錄的第一個日期的第一次讀數)。

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

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

如果我理解正確,則只需要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; 

Tweeking Gordon的回答...只是從日期中提取年份,然后根據其分組以消除位置。

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(最小)和max(最大)使用量,並從最大值中減去最小。 它不是日期驅動的,而是使用/年驅動的。 如果您出於某種原因在當年晚些時候的讀數低於最高值...它可能無法返回預期的結果...要真正成為日期驅動型,我們需要獲取最小/最大日期來查找這些值的用法並從那里去。

例如,如果閱讀是:

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的使用量為70000-10000或60000; 但也許您想要70000-20000 = 50000 ...

按年份分組的另一個答案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM