2014-07-21 55 views
0

我有我认为是一个常见的问题,但我已经搜索并找不到答案。选择已更改的记录

我有一个包含(简体)月,项目类型一大桌,价值

Jan ProjectA X 15000, 
Jan ProjectB X 2000, 
Jan ProjectB Y 2000, 
Jan ProjectC X 3000, 
..... 
Feb ProjectA X 15000, 
Feb ProjectB Y 4000, 
Feb ProjectC X 3000, 
Feb ProjectD X 8989, 
..... 
Mar ProjectA X 15000, 
Mar ProjectB Y 4000, 
Mar ProjectC X 3000, 
Mar ProjectD X 8989, 
..... 

我需要一个查询,显示:

所有项目+型一月,但不是月和​​
所有项目+键入2月但不是1月AND
所有项目+键入两个值但具有不同的值

我需要它在任何两个月之间抱歉不清楚

任何帮助将不胜感激(我曾尝试与NOT IN子查询和加入,但我觉得我失去了一些东西简单,因为我的查询变得非常大,仍然没有工作)

+1

这是与聚集做到这一点单个查询'所有项目+键入1月但不是2月和 所有项目+键入2月但不是1月和 所有项目+键入两个,但具有不同的值'? – bumbumpaw

+2

虽然他们没有工作,但在sql中看到失败的尝试会很有帮助。 – paqogomez

+0

我的意思是它作为一个单一的查询。我将在下次发布我的尝试。谢谢。 – arbit

回答

2

你应该能够

select project, type, 
     (case when sum(case when month = 'jan' then 1 else 0 end) > 0 and 
        sum(case when month = 'feb' then 1 else 0 end) = 0 
      then 'Jan-Only' 
      when sum(case when month = 'jan' then 1 else 0 end) = 0 and 
        sum(case when month = 'feb' then 1 else 0 end) > 0 
      then 'Feb-Only' 
      when max(case when month = 'jan' then value else 0 end) <> 
        max(case when month = 'feb' then value else 0 end) 
      then 'Different' 
     end) as Which 
from largetable lt 
group by project, type; 

可能过滤掉其中的值相等 - 2月是使用子查询的那些最简单的方法:

select t.* 
from (select project, type, 
      (case when sum(case when month = 'jan' then 1 else 0 end) > 0 and 
         sum(case when month = 'feb' then 1 else 0 end) = 0 
        then 'Jan-Only' 
        when sum(case when month = 'jan' then 1 else 0 end) = 0 and 
         sum(case when month = 'feb' then 1 else 0 end) > 0 
        then 'Feb-Only' 
        when max(case when month = 'jan' then value else 0 end) <> 
         max(case when month = 'feb' then value else 0 end) 
        then 'Different' 
       end) as Which 
     from largetable lt 
     where month in ('jan', 'feb') 
     group by project, type 
    ) t 
where Which is not null; 
+0

我希望的简单解决方案就在那里 - 尽管我永远不会找到它 - 谢谢 - 它的功能非常好 – arbit