2011-06-06 99 views
-1

我有一張表格,記錄每個月爲不同產品分配給不同員工的目標記錄,並且它具有一個狀態字段,用於記錄分配的目標是否被批准。創建一個有條件的選擇

狀態 - 1 >>待定,2 >>批准

如:

pdt_id month emp_id status 
1  04 1  2 
2  04 2  2 
3  04 3  1 

1  05 1  2 
2  05 2  2 
3  05 3  2 

現在我要生成一個報告,其中顯示了僅適用於不存在未決批准的月份。即從上述數據報告應該只顯示'05',因爲它是所有請求被批准的唯一一個月

如果我提供條件select month where status ='2'它將獲取04和05但我想只有05來獲取...

懇求

回答

0

個月,僅Approved狀態:

SELECT DISTINCT month 
FROM myTable a 
WHERE NOT EXISTS 
    (SELECT * 
    FROM myTable b 
    WHERE a.month = b.month 
     AND b.status <> 2 
) 

個月沒有任何Pending

SELECT DISTINCT month 
FROM myTable a 
WHERE NOT EXISTS 
    (SELECT * 
    FROM myTable b 
    WHERE a.month = b.month 
     AND b.status = 1 
) 

通常有3種方式做這樣那樣的問題,(使用NOT EXISTS ,使用NOT IN並使用LEFT JOINNULL檢查)。您已經有其他兩種方式的答案。

在這種特殊情況下,還有另一種(第4種)方式。如果你從來沒有打算比12增加更多的狀態,這也將工作:

SELECT month 
FROM myTable 
GROUP BY month 
HAVING MIN(status) = 2 

只是一個最後的意見/問題。你只在表格中儲存month,而不是year?因爲如果您還有year字段,則表中的數據超過一年後,查詢將不會顯示正確的結果。

+0

非常感謝。我使用了第二種方法..它似乎在工作......再次感謝你。 – Nick 2011-06-06 07:37:05

0

你可以沒有狀態待定只選擇個月:

select month from table_name as tb1 where 0 = (select count(*) from table_name as tb2 where tb2.state = '1' AND tb1.month = tb2.month) 
+0

如果你把我的答案投下來,寫出最新的錯誤將會很好。 – 2011-06-06 06:18:20

+0

這將顯示至少有一個狀態不是待定的月份。所以,它會同時顯示'04'和'05'個月。 – 2011-06-06 06:22:49

+0

沒有投下你的答案,但原因在問題中給出。 (測試狀態='2') – Dodo 2011-06-06 06:24:35

1

LEFT JOIN表到自身,以找出匹配並消除它們。

SELECT 
    t1.`month` 
FROM 
    your_table AS t1 
    LEFT JOIN your_table AS t2 
    ON t1.`month` = t2.`month` 
    AND t2.`status` = 1 
WHERE t2.month IS NULL 
GROUP BY t1.month 

可能有更多優雅的方式來做到這一點,但它完成了工作。

+0

你也可以使用(更接近標準)'WHERE t2.month IS NULL' – 2011-06-06 06:35:18

+0

非常真實,我剛剛更新了它。 – Bjoern 2011-06-06 06:40:09

2
SELECT month 
    FROM myTable 
    WHERE month NOT IN (
    SELECT month 
    FROM myTable 
    WHERE status = 1 
) 
+0

需要這個子查詢嗎?這可以被重寫爲SELECT月WHERE狀態<> 1 – 2011-06-06 06:33:30

+0

@Elzo:是的,它是必需的。這個問題涉及到很多行,所以簡單的選擇不太可能找到答案。 – 2011-06-06 06:36:25

-1

我不明白你爲什麼不做?

... WHERE month = "05" AND status = 2; 

如果你有另一個概念是「批准」,爲什麼不把它作爲列添加幷包含在查詢中呢?

有時修理一件事物意味着重新設計你的表格。

+1

甚至更​​好:'SELECT「05」'?如果你知道答案,爲什麼要問一個問題,對吧? – 2011-06-06 06:31:53

+1

我不明白這一點...在哪裏月=「05」和狀態= 2;它應該檢查一年的每個月,並選擇幾個月沒有pendings。如果至少有一個未決的請求不應被選中。 – Nick 2011-06-06 08:31:52

+0

我感覺你正在做一些非常複雜的事情,應該很簡單。 – 2011-06-06 09:07:20