具有多个返回值的SQL case语句

时间:2015-11-25 19:44:31

标签: sql

任何人都有类似这样的东西吗?它不需要是一个案例陈述。我没有访问Union或Join功能,所以最好不要使用它们。但如果使用Union或Join是实现它的唯一方法,那么我仍然对解决方案感兴趣。

以下是一些示例数据:

状态表:

(value, name):
(1, 'pending'),
(2, 'complete'),
(3, 'incomplete'),
(4, 'not required')

帐户表:

(name, accountNo, statusValue) : 
('Google', 12345, 1),
('Google', 12346, 2),
('Google', 12347, 1),
('Amazon', 22356, 1),
('Amazon', 22357, 3),
('Amazon', 22358, 2),
('Foo', 35677, 4),
('Foo', 35678, 4),
('Foo', 35672, 4)
('Bar', 55555, 1),
('Bar', 55556, 2),
('Bar', 55557, 3)

因此,帐户可以有多个帐号。根据帐号是否已处理,它可以从“待定”更改为“完成”。它可以是“不需要”,意味着根本不需要处理该帐户。

一个例子是:我想在一天结束时选择每个帐户的计数。如果该帐户来自亚马逊,Ebay,Facebook,那么我只想计算已完成的帐号。否则,我想计算所有帐号(或者尚未填写的所有帐号,或只计算具有特定身份的帐号)。

select account, count(account) from AccountTable 
where status = case 
    when account in ('name1', 'name2', 'name3') then (1, 2, 3, 4, 5, 6)
    else (1, 2, 3) end group by account;

或更简单的情况:

select name, count(name) from AccountTable 
where statusValue = case 
    when name in ('Amazon', 'Google', 'Ebay') then 1
    else everything     --everything as in all status, not a single value 'everything'
    end group by account;

第二个选择语句的预期输出:

 Name      Count(Name)
 Amazon      1
 Google      2
 Foo         3
 Bar         3

最后,这个:

select name, count(name) from AccountTable 
  where status = case 
    when account in ('Google', 'Amazon', 'Ebay') then 1
    else not 1  --every status that is not 1
    end group by account;   

谢谢(请忽略语法错误)。

1 个答案:

答案 0 :(得分:0)

如果您正在做我认为您正在做的事情,您可以使用普通的布尔逻辑执行此操作。

第一个陈述在逻辑上等同于:

select account, count(account) from AccountTable 
where (
        status in (4, 5, 6)
        and account in ('name1', 'name2', 'name3')
    )
    or status in (1, 2, 3)
group by account;

请注意,status in (4, 5, 6)会替换status in (1, 2, 3, 4, 5, 6),因为or因此在逻辑上等同于此。

第二个陈述在逻辑上等同于:

select account, count(account) from AccountTable 
where (status = 1 and account in ('name1', 'name2', 'name3'))
    or status <> 1
group by account;