SQL添加过滤参数而不更改数据

时间:2015-11-06 19:05:31

标签: sql sql-server

我有一个SQL命令来获取项目编号,项目标题,员工姓名&来自数据库的数字。

SELECT
DOS.NUMFOLDER as ProjectNumber, 
DOS.DESCRIPTION as ProjectTitle, 
EMP.NUMEMPL as EmployeeNumber, 
EMP.EMPLNAME+ ' ' + EMP.EMPLSURNAME as EmployeeName

FROM DOSEMPDT               DEM 
INNER JOIN DOSSIER          DOS ON DEM.SEQCONTRAT = DOS.SEQCONTRAT 
INNER JOIN EMPLOYE          EMP ON DEM.SEQEMPLOYE = EMP.SEQEMPLOYE 
--INNER JOIN BILLING        BIL ON DEM.SEQCONTRAT = FAC.SEQCONTRAT 

WHERE (DEM.DATEFINAFF IS NULL OR DEM.DATEFINAFF > GETDATE()) 
AND (DOS.DATEFIN IS NULL OR DOS.DATEFIN > GETDATE())
--AND FAC.DTBILLING IS NOT NULL
--AND FAC.DTBILLING >= DATEADD(mm, -1, GETDATE())

ORDER BY NoProjet

这给了我想要的东西;包含项目编号,项目标题和员工的表。预期的结果看起来有点像这样:

projectA   *titlea*   1111   Jim
projectA   *titlea*   2222   James
projectB   *titleb*   1111   Jim
projectB   *titleb*   3333   Paul

但我想在结果中添加一个过滤器。我仍然希望看到同一项目的多个实例,以及相关的员工,但我想只看到某些项目;那些BILLING日期不到一个月的人,而不显示BILLING

删除INNER JOIN BILLING之前的注释会使结果重复多次,可能是因为许多项目有很多BILLING,但我不知道如何避免这种情况。我认为这个问题存在于我的第3个INNER JOIN,我尝试了LEFT JOINRIGHT JOIN等等......但无济于事。

2 个答案:

答案 0 :(得分:1)

我相信您只是显示重复数据。

事实上,发票表将包含合同序号以及相对发票ID。例如

Project A   Invoice_001 
Project A   Invoice_002 

使用您当前的SELECT,您将永远得到:

projectA   *titlea*   1111   Jim  
projectA   *titlea*   2222   James  
projectB   *titleb*   1111   Jim  
projectB   *titleb*   3333   Paul  

但是,如果您在SELECT中添加发票列,您可能会得到:

projectA   *titlea*   1111   Jim   Invoice_001  
projectA   *titlea*   1111   Jim   Invoice_002  
projectA   *titlea*   2222   James Invoice_003  
projectB   *titleb*   1111   Jim   Invoice_004  
projectB   *titleb*   3333   Paul  Invoice_005  

所以,不再有重复的数据!

我希望这会有所帮助。

答案 1 :(得分:0)

您可以使用exists执行所需操作:

SELECT . . .
FROM DOSEMPDT DEM INNER JOIN
     DOSSIER DOS
     ON DEM.SEQCONTRAT = DOS.SEQCONTRAT INNER JOIN
     EMPLOYE EMP
     ON DEM.SEQEMPLOYE = EMP.SEQEMPLOYE 
WHERE (DEM.DATEFINAFF IS NULL OR DEM.DATEFINAFF > GETDATE())  AND
      (DOS.DATEFIN IS NULL OR DOS.DATEFIN > GETDATE()) AND
      EXISTS (SELECT 1
              FROM FACTURE FAC
              WHERE DEM.SEQCONTRAT = FAC.SEQCONTRAT AND
                    FAC.DTFACTURE IS NOT NULL AND
                    FAC.DTFACTURE >= DATEADD(month, -1, GETDATE())
             )