2017-08-03 32 views
0

好吧我有一个表项目编号&客户端。 该项目根据年份编号。例如。SQL,选择年前,但不能后

我想某一年之前选择的所有客户端,但如果他们也有,鉴于一年后项目数量。

所以表将是这个样子:

  • 2017001:客户A
  • 2017002:客户端B
  • 2017003:客户端C
  • 2016001:客户端C
  • 2016002:客户端D
  • 2016003:客户端F
  • 2015001:客户端C
  • 2015002:客户端d
  • 2015003:客户˚F

如果我想之前选择的所有客户端2016 &,我会得到客户ð&女,但不是C,因为它也是在2017年。

我知道我可以选择2016年所有客户端&然后在他们每个人身上做一个循环来检查他们是否在2017年有一个项目编号,但是有没有更简单的方法在单个SQL语句中执行此操作?

我现在的说法是这样的:

SELECT * FROM jobs WHERE jobno < 2016000 

我知道这并不工作,但我试图做这样的事情:

SELECT * FROM jobs WHERE jobno < 2016000 AND jobno !> 2016000 
+0

什么是列类型,是VARCHAR或数?? 其次,你需要D和F作为输出,对吗? –

+0

我的同事建议这一点,它似乎对我有用: SELECT DISTINCT客户端从作业WHERE jobno <2017000和客户端不在(选择DISTINCT客户端从作业地点jobno> 2017000) –

回答

0

试试这个:

SELECT * FROM jobs WHERE jobno < 2017000 
+0

这将不会正确消除客户端C从示例测试。 –

0

首先,如果您想在之前选择所有客户端2016 &,则需要查询jobno < 2017000,而不是jobno < 2016000

先选择查询jobno < 2017000并保存结果。

INSERT INTO result SELECT DISTINCT * FROM jobs WHERE jobno < 2017000 

然后再从保存的结果中选择jobno !> 2017000

SELECT DISTINCT * FROM result WHERE jobno !> 2017000 

最终结果将是你想要的。

0

首先SELECT * FROM jobs WHERE jobno < 2016000将选择工作数量严格低于2016000的工作,这意味着您实际上在2016年排除了工作。

相反,使用:

SELECT * FROM jobs WHERE jobno < 2017000 

现在,如果你也想排除谁在2017年工作的客户,这应该工作:

SELECT clientname 
FROM jobs 
GROUP BY clientname 
HAVING max(jobno) < 2017000 
+0

谢谢,回复。什么是“max_jobno”在做什么?它似乎并没有被使用。 –

+0

你是对的,它没有被使用。我编辑了答案。 – Unatiel