2011-05-16 87 views
2

我有一个观点,看起来像这样:一组行的状态合并成一个单一的汇总状态

package_id package_line status_a  status_b 
1   1    NOT_STARTED  FAILED 
1   2    STARTED   STARTED 
1   3    FAILED   NOT_STARTED 
2   1    COMPLETE  STARTED 
2   2    COMPLETE  NOT_STARTED 

等,几千行。 Status_a和status_b是单独的不相关的状态(实际上它们是在系统a和系统b上执行的包)。

我需要总结的的package_id,卷起到

package_id status_a status_b 
    1   FAILED FAILED 
    2   COMPLETE NOT_STARTED 

的规则组合包线

1. If any package line has failed, the package has failed. 
2. If all package lines are complete, the package is complete. 
3. If all package lines are NOT_STARTED, the package has not started. 
4. Otherwise, the package is started (i.e. a combination of started, not_started, and complete would summarize as STARTED). 

所以我想拿出一个查询来创建此概要。我很想发布代码示例,但我真的很失落。据推测我想GROUP_BY package_id,但我可以使用什么作为一个聚合函数,使我可以应用列出的规则?

如果有帮助,我确实可以控制在包行级别报告状态的方式,所以我可以报告数字状态(尽管为了理智,我喜欢让它具有人类可读性)。

回答

4

试试这个(同为status_b):

SELECT package_id, 
     CASE WHEN FAILED_COUNT > 0 THEN 'FAILED' 
      WHEN COMPLETE_COUNT = ALL_COUNT THEN 'COMPLETE' 
      WHEN NOT_STARTED_COUNT = ALL_COUNT THEN 'NOT_STARTED' 
      ELSE 'STARTED' 
     END status_a 
FROM (   
SELECT package_id, 
    COUNT(status_a) ALL_COUNT, 
    SUM(CASE WHEN status_a = 'FAILED' THEN 1 ELSE 0 END) FAILED_COUNT, 
    SUM(CASE WHEN status_a = 'COMPLETE' THEN 1 ELSE 0 END) COMPLETE_COUNT, 
    SUM(CASE WHEN status_a = 'NOT_STARTED' THEN 1 ELSE 0 END) NOT_STARTED_COUNT, 
    SUM(CASE WHEN status_a = 'STARTED' THEN 1 ELSE 0 END) STARTED_COUNT 
FROM table 
GROUP BY package_id 
) 
+0

完美,谢谢!修复了一些错位的逗号,以防其他人想要使用这一天。 – 2011-05-17 14:18:13

相关问题