我有一个表格,记录每个月为不同产品分配给不同员工的目标,并且它有一个状态字段,用于记录分配的目标是否已被批准。
status - 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',因为它是所有请求获得批准的唯一月份
如果我提供条件选择月份,其中status ='2'它将同时获取04和05但我只想获取05 ...
恳求
答案 0 :(得分:2)
SELECT month
FROM myTable
WHERE month NOT IN (
SELECT month
FROM myTable
WHERE status = 1
)
答案 1 :(得分: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
这可能有更优雅的方法,但它可以完成工作。
答案 2 :(得分: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)
答案 3 :(得分: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 JOIN
进行NULL
检查)。您已经有其他两种方式的答案。
在这种特殊情况下,还有另一种(第四种)方式。如果您从未计划添加比1
和2
更多的状态,那么这也会有效:
SELECT month
FROM myTable
GROUP BY month
HAVING MIN(status) = 2
最后的评论/问题。您是否只在表格中存储month
,而不是year
?因为如果您还有一个year
字段,那么一旦您在表格中有超过一年的数据,查询就不会显示正确的结果。
答案 4 :(得分:-1)
我不明白你为什么不这样做?
... WHERE month = "05" AND status = 2;
如果您有另一个“已批准”的概念,为什么不将其添加为列并将其包含在查询中呢?
有时修理一件事意味着重新设计你的桌子。