2013-12-20 50 views
0

夥計們,SQL Server的計算無關的條件

我已經第一研究這個問題,並沒有與我的具體問題來了,我發現SUM/CASE這是整潔,但不正是我需要的。這是我的情況:

我被要求報告符合條件的人總數5 8條件中的5個。 我有麻煩提出這樣做​​的最佳方式。它必須與每個條件有一個counter有關,然後在最後加上計數器並返回滿足8個條件中的5個的人數(稱爲條件a-h)

那麼你能做什麼計數?

喜歡的東西

if exists (code for condition A) 1 ELSE 0 
if exists (code for condition B) 1 ELSE 0 
etc 

sum(count) 

謝謝

+2

爲了幫助您,我們需要更多關於您的架構以及您迄今爲止所嘗試的內容的詳細信息。另外,你正在使用什麼數據庫? – user2989408

+1

所有條件都存在於同一行,還是需要分析多行? –

+0

我正在使用SQL Server 2008 R2,需要爲此分析多行和多列表 – DrHouseofSQL

回答

0

我結束了使用WITH語句 是這樣完成的:

爲第一個SELECT語句條件AS等等

,用於第二條件AS嗒嗒Select語句

對於第三條件AS嗒嗒Select語句

爲第四條件AS嗒嗒Select語句

爲第五條件AS嗒嗒

爲第六條件選擇語句選擇語句AS等等

Select條件第七條件AS等等

第八條件AS等等Select語句

選擇

CASE WHEN(基於8個選擇上述

我只是把在電子表格中的結果8例,做了所有的數學在Excel中

0

如何:

WHERE CASE WHEN (Code for condition A) then 1 else 0 end + 
     CASE WHEN (Code for condition B) then 1 else 0 end + 
     CASE WHEN (Code for condition C) then 1 else 0 end + 
     ... 
     = 5 
+1

我認爲條件應該更像是> = 5。 – user2989408

1

由於條件跨行蔓延,你可以通過在組合MAX()CASE聲明這樣做條款:

SELECT person_ID 
FROM YourTable 
GROUP BY Person_ID 
HAVING MAX(CASE WHEN ConditionA THEN 1 END) 
    + MAX(CASE WHEN ConditionB THEN 1 END) 
    + MAX(CASE WHEN ConditionC THEN 1 END) 
    + MAX(CASE WHEN ConditionD THEN 1 END) 
    + MAX(CASE WHEN ConditionE THEN 1 END) 
    + MAX(CASE WHEN ConditionF THEN 1 END) 
    + MAX(CASE WHEN ConditionG THEN 1 END) 
    + MAX(CASE WHEN ConditionH THEN 1 END) 
    >= 5 
+0

如下所示,或許應該> = 5 – rwking

+0

@wwking,但是OP指出「滿足8個條件中的5個的人」不是'至少5'。 –

+0

是的。這可能是不正確的,但我幾乎認爲滿足8個條件中的6個的人也滿足8個條件中的5個。 – rwking

0

用戶定義函數來救援

SELECT * FROM view_people_with_conditions_count WHERE conditions_count BETWEEN 5 AND 8 

CREATE VIEW view_people_with_conditions_count 
AS 
SELECT *, dbo.GetCondtionsCount(id) as conditions_count FROM peoples_table 

CREATE function GetCondtionsCount(@id int) 
RETURNS int 
AS 
BEGIN 
     DECLARE @counter int 

     ' implement your conditions here 
     IF (condtion1) SET @counter = @counter + 1 
     IF (condtion2) SET @counter = @counter + 1 
     IF (condtion3) SET @counter = @counter + 1 
     RETURN @counter 
END