2016-03-09 36 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