子查询

时间:2015-07-05 19:50:58

标签: sql case

我可以在以下帖子的帮助下创建以下查询

select * from duppri t
where exists (
  select 1
  from duppri
  where symbolUP = t.symbolUP
  AND date = t.date
  and price <> t.price)
  ORDER BY date

SQL to check when pairs don't match

我现在意识到我需要添加一个case语句来指示所有上述条件何时适合,但duppri和t.duppri之间的类型值相等。这是因为区分大小写。此查询试图清理投资组合会计系统,遗憾的是,该系统允许多次重复,因为它没有强大的参照完整性或约束。

我希望case语句生成列'isMatch'

Date      |Type|Symbol   |SymbolUP |Concatt      |Price |IsMatch
6/30/1995 |gaus|313586U72|313586U72|gaus313586U72|109.25|Different
6/30/1995 |gbus|313586U72|313586U72|gbus313586U72|108.94|Different
6/30/1995 |agus|SRR      |SRR      |agusSRR      |10.25 |Different
6/30/1995 |lcus|SRR      |SRR      |lcusSRR      |0.45  |Different
11/27/1996|lcus|LLY      |LLY      |lcusLLY      |76.37 |Matched
11/27/1996|lcus|lly      |LLY      |lcusLLY      |76    |Matched
11/28/1996|lcus|LLY      |LLY      |lcusLLY      |76.37 |Matched
11/28/1996|lcus|lly      |LLY      |lcusLLY      |76    |Matched

我尝试了以下CASE语句,但它正在创建错误

SELECT * from duppri t
where exists (
  select 1,
  CASE IsMatch WHEN [type] = [t.TYPE] THEN 'Matched' ELSE 'Different' END
  from duppri
  where symbolUP = t.symbolUP
  AND date = t.date
  and price <> t.price) 

  ORDER BY date

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你可以使用窗口函数:

select d.*,
       (case when mint = maxt
             then 'Matched' else 'Different'
        end)
from (select d.*, 
             min(type) over (partition by symbolup, date) as mint,
             max(type) over (partition by symbolup, date) as maxt,
             min(price) over (partition by symbolup, date) as minp,
             max(price) over (partition by symbolup, date) as maxp
      from duppri d
     ) d
where minp <> maxp
order by date;

答案 1 :(得分:0)

与存在谓词一起使用的子查询不能返回除true / false之外的任何内容,但是你可以使用像这样的子查询来完成你想要的东西,这应该可以工作:

select 
  *, 
  (select 
   CASE when count(distinct type) = 1 THEN 'Matched' ELSE 'Different' END
   from duppri
   where symbol = t.symbol and date = t.date
  ) IsMatch
from duppri t
where exists (
  select 1
  from duppri
  where symbol = t.symbol
  and price <> t.price);