具有多个条件的复杂筛选SQL Server查询

杰德里克

我有一个SQL Server查询,其中将多个表连接在一起,我们正在使用SQL Server2012。我有一个客户编号,客户名称,项目类型,一个文档编号字段(可以是两个文档中的一个我将提到两个表;即使稍后提到两个字段,我也希望使用CASE语句将该字段合并为一个字段),文档金额,文档日期,到期日,尚待支付的金额以及说明。

问题在于,对于我的项目类型,一个表(RM20101)无法识别与其关联的项目类型,因为该表中没有任何项目类型。另一个表(Custom_RecData)可以识别所有相关单据编号的正确物料类型,但是该表仅具有与物料相关联的单据编号记录-系统中并非所有单据编号都具有该记录。

因此,这是经过精简的版本的示例:

CUSTNMBR    |  ItemType    |   DocumentNumberRM |  DocNumCUSTOM | DocAmount
------------+--------------+--------------------+---------------+-----------
12345ABC    |  NULL        |   PYMNT01234567    |  NULL         |  - 28.50
12345ABC    |  TOYS        |   9010456778       |  9010456778   |   300.00
12345ABC    |  NULL        |   9010456778       |  NULL         |   300.00
12345ABC    |  NULL        |   9019888878       |  NULL         |    47.90
12345ABC    |  CRAFTS      |   9502345671       |  9502345671   |   145.25
12345ABC    |  NULL        |   9502345671       |  NULL         |   145.25

在此示例中,我将文档编号的列命名为“ RM”从RM20101表中列出,将“ CUSTOM”从Custom_RecDate表中列出。

因此,我尝试了很多方法,从CASE语句到我的WHERE子句,再到HAVING子句,再到子查询...我无法弄清楚。这是我想看到的:

CUSTNMBR    |  ItemType    |   DocumentNumberRM |  DocNumCUSTOM | DocAmount
------------+--------------+--------------------+---------------+-----------
12345ABC    |  NULL        |   PYMNT01234567    |  NULL         |  - 28.50
12345ABC    |  TOYS        |   9010456778       |  9010456778   |   300.00
12345ABC    |  NULL        |   9019888878       |  NULL         |    47.90
12345ABC    |  CRAFTS      |   9502345671       |  9502345671   |   145.25

那么,为什么将我称为多重条件呢?好吧,如果您看这张桌子,我将根据以下内容删除项目:

  1. 如果“ItemType与”DocNumCUSTOM字段都为NULL,则显示它。
  2. 如果ItemTypeIS NOT NULL且两个文档编号字段都不为NULL,则显示它。
  3. 如果是ItemTypeIS NULL和DocNumCUSTOMIS NULL,但是我们已经在RM20101 DocumentNumberRM字段中看到了文档编号(我怀疑它在COUNT之类的HAVING子句中),那么就不要再显示它了。

如果我找不到执行步骤3的方法,则将得到重复的内容,如我最初的示例所示。

我基本上不希望重复。我想显示一个项目类型,它是否为NULL(在任何一个表中都不存在该文档编号),或者如果表中存在该表,显示一次Custom_RecDate,这是其中唯一具有项目类型信息的表。

这有意义吗?我知道这听起来很复杂,但希望有人能理解这一切。:)

谢谢!

顺便说一下,这是重要的部分(我的查询,尽管对示例进行了精简):

SELECT DISTINCT
    R1.CUSTNMBR,
    I.ITMCLSCD AS [ItemType],
    R1.DOCNUMBR AS [DocumentNumberRM],
    I.DOCNUMBR AS [DocNumCUSTOM],
    R1.ORTRXAMT AS [DocAmount]
FROM
    RM20101 R1
JOIN 
    RM40401 R2 ON R2.RMDTYPAL = R1.RMDTYPAL
JOIN 
    RM00401 R3 ON R3.DOCNUMBR = R1.DOCNUMBR
JOIN 
    RM00101 R4 ON R4.CUSTNMBR = R1.CUSTNMBR
LEFT OUTER JOIN 
    SR_ITCMCD C ON C.CUSTNMBR = R1.CUSTNMBR
LEFT OUTER JOIN 
    AR_Description D ON D.SOPNUM = R1.DOCNUMBR
LEFT OUTER JOIN 
    Custom_RecData I ON I.ITEMNMBR = C.ITEMNMBR 
                     AND I.DOCNUMBR = R1.DOCNUMBR

再次,我尝试使用CASE语句并将各种条件放在我的WHERE子句中,只是无法弄清楚。

亚伦·迪茨(Aaron Dietz)

纯粹基于样本数据,MAX()应该做到这一点:

SELECT
    R1.CUSTNMBR,
    MAX(I.ITMCLSCD) AS [ItemType],
    R1.DOCNUMBR AS [DocumentNumberRM],
    MAX(I.DOCNUMBR) AS [DocNumCUSTOM],
    R1.ORTRXAMT AS [DocAmount]
FROM RM20101 R1
JOIN RM40401 R2 ON R2.RMDTYPAL = R1.RMDTYPAL
JOIN RM00401 R3 ON R3.DOCNUMBR = R1.DOCNUMBR
JOIN RM00101 R4 ON R4.CUSTNMBR = R1.CUSTNMBR
LEFT OUTER JOIN SR_ITCMCD C ON C.CUSTNMBR = R1.CUSTNMBR
LEFT OUTER JOIN AR_Description D ON D.SOPNUM = R1.DOCNUMBR
LEFT OUTER JOIN Custom_RecData I ON I.ITEMNMBR = C.ITEMNMBR 
                                AND I.DOCNUMBR = R1.DOCNUMBR
GROUP BY 
    R1.CUSTNMBR,
    R1.DOCNUMBR,
    R1.ORTRXAMT

删除了,DISTINCT因为GROUP BY它将完成相同的操作,并且对于MAX()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章