2013-04-01 106 views
1

幾天前我問過一個問題。這是鏈接。 Count() corresponding to max()根據一些條件顯示計數

現在用同一套表(SQL Fiddle)我想檢查不同的條件

如果第一個問題是關於涉及到的狀態的最大計數,這個問題是關於出基於計數關於每個項目的下一個狀態。

說明

如可以在表user_approval看到,appr_prjt_id = 1有3種不同的狀態,即10,20,30。下一個狀態是40(每次批准狀態增加10)等等。那麼是否有可能證明有一個項目的狀態等於40?只能顯示在輸出相當於40狀態的計數(不在狀態10,20,30,...等)

所需的輸出:

   10 | 20 | 30 | 40 

location1  0 | 0 | 0 | 1 
+0

閱讀您的問題幾次。仍然不明白。定義一個狀態等於40的項目。這可能意味着一些事情。 –

+0

@ErwinBrandstetter好的。我會解釋。 10,20,30,40代表不同級別的認證。爲了解釋這個場景,讓我們看看兩個狀態。可以說30作爲'經理批准',40作爲'管理員批准'。正如我在問題中所解釋的,每次獲得批准時,當前狀態都會增加10。所以,如果一個項目的當前狀態爲30,這意味着它已經通過'管理者批准',現在它正在等待'管理員批准'。因此,相應於「管理員批准」的計數 – harry

+0

因此,「狀態等待爲40的項目」與「表user_approval中最大狀態爲30的項目完全相同」?另外:你寫它'是關於顯示每個項目的下一個狀態',但是然後你顯示一個*位置的單行*?這是矛盾的。請澄清你需要什麼輸出*完全*。 –

回答

0
select * from user_approval where appr_status 
= (select max(appr_status) from user_approval where appr_status < 40); 

SQL小提琴: - http://www.sqlfiddle.com/#!11/f5243/10

+0

請參閱編輯的問題。 – harry

1

不知道什麼the next status will be 40的含義。但是,假設狀態與每一個批准增加10,下面應該工作:

SELECT * 
FROM user_projects pr 
WHERE EXISTS (
    SELECT * FROM user_approval ex 
    WHERE ex.appr_prjt_id = pr.proj_id 
    AND ex.appr_status = 30 
) 
AND NOT EXISTS (
    SELECT * FROM user_approval nx 
    WHERE nx.appr_prjt_id = pr.proj_id 
    AND nx.appr_status >= 40 
); 
+0

您的設定是正確的。每次批准狀態都會增加10.我已更新問題 – harry

+0

中的那條信息請參閱已編輯的問題。 – harry

+0

我解答了原始問題。你可以嘗試自己實現額外的PIVOT。 – wildplasser

1

你可以得到數,爲每一個查詢下一個狀態的要求,看起來更像是:

select 
    sum(case when ua.appr_status = 10 then 1 else 0 end) as app_waiting_20, 
    sum(case when ua.appr_status = 20 then 1 else 0 end) as app_waiting_30, 
    sum(case when ua.appr_status = 30 then 1 else 0 end) as app_waiting_40 
from 
    user_approval ua; 

該解決方案的好處只有一個表掃描,並且您還可以在查詢結果中添加各種其他計數/總和。