任何人都有类似这样的东西吗?它不需要是一个案例陈述。我没有访问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;
谢谢(请忽略语法错误)。
答案 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;