2016-12-22 117 views
0

最近,我正在查詢數據以形成SQL新手公司的報告。如何使用SQL計算父親器官統計信息

我有孩子器官的原始數據,同時,我還需要計算總量的它的上級機構。

我已經使用全外連接把所有的器官一起在一個表中,增加一列「parent_organ」,以表明自己的關係,在圖中所示:

enter image description here

我有一些時間使用低於SQL查詢,但失敗了,任何人都可以幫忙嗎?謝謝。

SELECT ORGAN, 
    SUM(CASE WHEN parent_organ LIKE '%'||ORGAN||'%' THEN 
      sales 
     ELSE 0 END) AS sales_sum 
FROM table GROUP BY organ 
+0

您正在使用哪些DBMS? –

+0

你真的在你的表格中以逗號分隔列表的形式存儲父代器官嗎?這是一個**非常糟糕的設計。你應該[編輯]你的問題,並將'create table'語句添加到你的問題。 [_Formatted_](http://stackoverflow.com/help/formatting)文本請[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images代碼提示/ 285557#285557) –

+0

@a_horse_with_no_name:我們正在使用DB2 10.5。這是一個遺留表格,同意你的糟糕設計。我簡化了我的問題。事實上,該表具有五個層次的器官,即A∈B∈C∈D∈E,其中只有A,最低層次具有真實的商業數據,所有父母的(B,C,D,E)統計應該是通過將它們相加來計算。還有很多像A和B,C,D,E這樣的器官。我知道這個問題可以通過使用SP並創建一個新表來保存數據來解決。但想用SQL查詢來解決這個問題 –

回答

0

Postgres我假設,通過||連接?從全外連接的行集:

SELECT organ, sales FROM test WHERE parent IS NOT NULL 
UNION 
SELECT a.organ, sum(b.sales) 
FROM test a 
JOIN test b ON b.parent LIKE '%'||a.organ||'%' 
GROUP BY a.organ; 

這顯然不是偉大的,因爲它使你的原始連接冗餘:它的運行兩個查詢和簡單地推動在一起的結果。如果沒有完整的外連接並編輯每個查詢以從原始源獲取數據,您會更好。

我不認爲有一個與你儘管提出的建立一個更好的辦法。如果父子關係是一個合適的外鍵,你可能會從原始表中得到GROUPING SETS,但這不適用於你正在做的字符串匹配。

+0

'||'不是Postgres特定的。它是SQL標準中定義的字符串連接運算符。 –