2014-02-26 60 views
1

因此,我有一個交叉表來衡量單個工廠花費的小時數。我們的行分開工作時間的任務類型,列分離工作小時的設施。在Cognos/SQL中將具有類似度量的列結合在交叉表中

我的問題是,在我們的數據庫中,我們有2個設施級別。每個1級設施下面都有10個2級「兒童」系統。我們想要的是能夠將所有二級設施欄的數據轉移到其各自的一級設施家長。

我已經在下面包含了一個例子。第一個t̶a̶b̶l̶e̶交叉表是我擁有的交叉表,我想要到第二個t̶a̶b̶l̶e̶交叉表。

所以在我們的系統中「父」與「子」設施,通過一個名爲OBJ_PARENT場相連。每個「子」在OBJ_PARENT中都有其「父」的名稱。

我會根據請求給出我寫的SQL。

編輯:我在下面提供

select EVT_WORKORDER, EVT_DEPARTMENT, EVT_WOSTATUS, EVT_WOTYPE, EVT_FACILITY, OBJ_FACILITY, OBJ_PMD, OBJ_PARENT, BOO_HOURS, BOO_DATE, BOO_ENTERED, BOO_ACTIVITY, BOO_PERSON, ACT_ACTIVITY, ACT_TASK, ACT_WORKORDER, PRV_CODE, PRV_PROPERTY, PRV_VALUE, 
sum(case when boo_person <> 'UNPAID' then boo_hours else 0 end) "Paid Hours", 
sum(boo_hours) "All Hours" 
FROM R5EVENTS 
JOIN R5OBJECTS ON EVT_FACILITY = OBJ_FACILITY 
JOIN R5BOOKEDHOURS ON BOO_EVENT = EVT_WORKORDER 
join R5ACTIVITIES on EVT_WORKORDER = ACT_WORKORDER 
JOIN r5propertyvalues ON (ACT_TASK || '#0' = PRV_CODE) 
where prv_property = 'CORESRV' 
and ACT_ACTIVITY= BOO_ACTIVITY 
AND EVT_DEPARTMENT = 'PK-MAINT' 
AND EVT_WOTYPE IN ('JOB', 'PPM') 
AND EVT_WOSTATUS IN ('R', 'FC', 'C', 'H', 'FI', 'CI', 'AP', 'IP', 'DF') 
and OBJ_PMD in (#PROMPTMANY ('PMD')#) 
and (OBJ_FACILITY in (#PROMPTMANY ('Park')#) 
     OR 
     OBJ_PARENT in (SELECT OBJ_FACILITY from R5OBJECTS where OBJ_FACILITY in (#PROMPTMANY ('Park')#))) 
group by EVT_WORKORDER, EVT_DEPARTMENT, EVT_WOSTATUS, EVT_WOTYPE, EVT_FACILITY, OBJ_FACILITY, OBJ_PMD, OBJ_PARENT, BOO_HOURS, BOO_DATE, BOO_ENTERED, BOO_ACTIVITY, BOO_PERSON, ACT_ACTIVITY, ACT_TASK, ACT_WORKORDER, PRV_CODE, PRV_PROPERTY, PRV_VALUE 

BOO我目前的SQL表示 「預訂」

+1

如果您的表在數據庫中看起來像這樣,您需要閱讀規範化。 – Kermit

回答

2

的正確方法應該是:

  • 在創建真正的分層表數據庫
  • 讓所有的孩子(在這種情況下,您的數據存儲的方式,也包括您所指的級別1)涉及到一個pa租住在FM
  • 模式,使事實表聯接到維度表上的孩子
  • 從層次結構表
  • 揭露父對象帶來父對象到交叉表的頂部邊緣

如果你想快速和骯髒地使用它,可以使用某種字符串函數來切斷設施的「孩子」部分。

+0

不幸的是,由於許可權利,我們無法在我們的系統中創建新表格。 –

+1

這是凱文常見的事情。許多公司所做的是創建自己的數據庫進行報告,然後設置ETL,將數據從第三方數據庫中夜間提取到報告數據庫中。 – Damienknight