2011-06-06 102 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