2016-12-22 77 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标准中定义的字符串连接运算符。 –