2014-08-27 100 views
1

我試圖創建一個查詢來獲取每個資產位置的電纜數量。流程是Project-> Asset-> Cable。一個項目可以擁有多個資產,並將多條電纜與這些資產相關聯。以下是數據的快照。基於條件的Oracle SQL計數

RECORD_ID PARENT_RECORD_ID FORM_NAME PARENT_FORM FIELD_NAME VALUE 
    1604   1603   asset   project  serial  b345s 
    1604   1603   asset   project  location OH 
    1605   1604   cable   asset   zone  green 
    1606   1603   asset   project  location NY 
    1607   1606   cable   asset   port  2 

正如您在上面所看到的,在電纜級別,PARENT_RECORD_ID是資產的「RECORD_ID」。這只是一個快照,因爲有成千上萬行,其間有大量數據,但我試圖只顯示相關數據。

我需要找出一種方法來捲起每個資產的電纜通過「位置」資產的數量,然後組。 '位置'是該資產的FIELD_NAME列中的值,其值與VALUE列中的值相關聯。例如,以上,資產ID 1604,'位置'是'OH'。

到目前爲止,我已經能夠得到電纜總人數的計數。我只需要弄清楚如何通過他們的「資產」的「位置」來解決這些問題。

SELECT 
    COUNT(DISTINCT RECORD_ID) "Number of Cables" 
FROM 
    PROJECT_TABLE 
WHERE 
    LOWER(FORM_NAME) = 'cable' 

當前上述查詢結果:

Number of Cables 
    3137 

我想什麼結果的樣子:

Location  Number of Cables 
    OH    552 
    NY    1042 
    MI    49 
    CA    1494 

任何幫助,不勝感激!謝謝!

+0

那麼,哪一列是「位置?」 – OldProgrammer 2014-08-27 20:59:04

+0

位置列?如果這是同一個表的一部分,請將其包含在您的select語句中。否則加入另一張桌子。似乎直截了當,除非我缺少邏輯? – programnub112 2014-08-27 20:59:47

+0

我很抱歉,我會在帖子中澄清。 'location'是資產的'FIELD_NAME'列中的值。同一行上的VALUE列的狀態與該FIELD_NAME的「位置」相關聯。 – ad2387 2014-08-27 21:04:21

回答

1

這應該可以做到。

select 
    ass.VALUE as LOCATION, 
    COUNT(DISTINCT cab.RECORD_ID) as CABLE_COUNT 
from 
    PROJECT_TABLE cab 
    inner join PROJECT_TABLE ass on ass.RECORD_ID = cab.PARENT_RECORD_ID 
where 
    cab.FORM_NAME = 'cable' and 
    ass.FORM_NAME = 'asset' and -- should always be the case? 
    ass.FIELD_NAME = 'location' 
group by 
    ass.VALUE 

一些提示:

  • 爲表使用的別名。在這種情況下,你必須這麼做,因爲同一張桌子使用了兩次,但是當我不必時,我也會這樣做。
  • 如果使用別名,請務必使用縮寫像ass如果您要查詢的資產。這是生活中的小樂趣之一。 :)
  • 我已經刪除lower。如果不需要,請將其保留。不需要調用函數,就可以充分使用索引,並且查詢速度會更快。確保所有值都具有相同大小寫,或更好的情況下,使用包含具有數字ID的名稱的Forms表,並在其他表中使用該ID。 (谷歌替代鍵)。或者,看看函數索引。這使Oracle能夠建立一個基於函數結果而不是正常值的索引。
  • 如果只有一個用於電纜的記錄,你不需要distinct在計數,你將不再需要的條件ass.FORM_NAME = 'asset',使您的查詢優化多一點。
  • FORM_NAMEVALUE的組合索引是有益的,但只有當您需要這兩個條件(請參閱查詢中的評論)並且不使用lower(請參閱上面的兩個備註)時纔有用。
  • 一般來說,像這些通用表是不好的做法。如果您對資產,項目和位置有單獨的表格並且制定了適當的規範化模型,那麼您將擁有一個更好,更易維護的數據模型,該模型更易於閱讀和使用。
+0

感謝您的回覆。查詢目前沒有返回任何數據,所以我正在調查爲什麼可能是這樣:/ – ad2387 2014-08-27 21:11:18

+0

我有'RECORD_ID'和'PARENT_RECORD_ID',缺少一些下劃線。除此之外,我沒有看到有什麼問題,但是我只是在記事本中輸入它,所以我可能忽略了一些東西。 – GolezTrol 2014-08-27 21:14:05

+0

是的,我抓到了那些,查詢運行沒有錯誤。目前沒有任何回報。 – ad2387 2014-08-27 21:15:12