2016-03-09 37 views
1

有没有另一种方法可以用更少的代码来总结计数?添加数值的计数

我使用一个视图(我唯一的选择),以试图找出如果客户在过去5历年中任意两个花的钱

表名: V_PERSON V_REVENUE

列: V_PERSON.ID

V.REVENUE.PersonID 
V.REVENUE.Year1 revenue for the year (currently 2016) 
V.REVENUE.Year2 revenue for the year (currently, 2015) 
V.REVENUE.Year3 
V.REVENUE.Year4 
V.REVENUE.Year5 

这是我已经试过:

SELECT V_PERSON.ID 

FROM V_PERSON 

WHERE 
(

(
SELECT '1' 
FROM V_REVENUE 
WHERE V_REVENUE.PersonID = V_PERSON.ID 
AND V_REVENUE.Year1 > 0 
) 

+ 

(
SELECT '1' 
FROM V_REVENUE 
WHERE V_REVENUE.PersonID = V_PERSON.ID 
AND V_REVENUE.Year2 > 0 
) 

+ 

(
SELECT '1' 
FROM V_REVENUE 
WHERE V_REVENUE.PersonID = V_PERSON.ID 
AND V_REVENUE.Year3 > 0 
) 

+ 

(
SELECT '1' 
FROM V_REVENUE 
WHERE V_REVENUE.PersonID = V_PERSON.ID 
AND V_REVENUE.Year4 > 0 
) 

+ 

(
SELECT '1' 
FROM V_REVENUE 
WHERE V_REVENUE.PersonID = V_PERSON.ID 
AND V_REVENUE.Year5 > 0 
) 

) >= 2 

回答

1

下面是使用existscase陈述一个选项:

select id 
from person p 
where exists (
    select 1 
    from revenue r 
    where p.id = r.personid 
     and case when r.year1 > 0 then 1 else 0 end + 
      case when r.year2 > 0 then 1 else 0 end + 
      case when r.year3 > 0 then 1 else 0 end + 
      case when r.year4 > 0 then 1 else 0 end + 
      case when r.year5 > 0 then 1 else 0 end >= 2 
) 
1

怎么样CASE声明:

SELECT V_PERSON.ID 
FROM V_PERSON 
WHERE 
(
SELECT (case when V_REVENUE.Year1 > 0 then 1 else 0 end) + 
    (case when V_REVENUE.Year2 > 0 then 1 else 0 end) + 
    (case when V_REVENUE.Year3 > 0 then 1 else 0 end) + 
    (case when V_REVENUE.Year4 > 0 then 1 else 0 end) + 
    (case when V_REVENUE.Year5 > 0 then 1 else 0 end) 
FROM V_REVENUE 
WHERE V_REVENUE.PersonID = V_PERSON.ID) >= 2 
+0

我喜欢这一个了。谢谢。 – 4ccc4