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

具有多个条件的复杂筛选SQL Server查询,sql,sql-server,where,Sql,Sql Server,Where,我有一个SQL Server查询,其中我将几个表连接在一起,我们使用的是SQL Server 2012。我有一个客户编号、客户名称、项目类型、一个文档编号字段(可以是我将提到的两个表中的一个文档编号;尽管后面提到了两个字段,但我确实希望使用案例陈述将其合并为一个字段)、文档金额、文档日期、到期日期、剩余支付金额,和描述 问题是,对于我的项目类型,一个表(RM20101)无法识别与其关联的项目类型,因为该表中没有项目类型。另一个表(Custom\u RecData)识别所有相关文档编号的正确项目类

我有一个SQL Server查询,其中我将几个表连接在一起,我们使用的是SQL Server 2012。我有一个客户编号、客户名称、项目类型、一个文档编号字段(可以是我将提到的两个表中的一个文档编号;尽管后面提到了两个字段,但我确实希望使用案例陈述将其合并为一个字段)、文档金额、文档日期、到期日期、剩余支付金额,和描述

问题是,对于我的项目类型,一个表(
RM20101
)无法识别与其关联的项目类型,因为该表中没有项目类型。另一个表(
Custom\u 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\u 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
那么为什么我称之为多重条件呢?好吧,如果你看一下表格,我将根据以下内容删减项目:

  • 如果
    ItemType
    DocNumCUSTOM
    字段均为空,则显示该字段
  • 如果
    ItemType
    不为空且两个文档编号字段都不为空,则显示它
  • 如果
    ItemType
    为NULL,并且
    DocNumCUSTOM
    为NULL,但是我们已经在
    RM20101
    DocumentNumberRM
    字段中看到了文档编号(我怀疑它可能位于计数或其他内容的HAVING子句中),那么不要再次显示它
  • 如果我找不到执行步骤3的方法,我将获得初始示例中所示的副本

    我基本上不想重复。我想显示一个项目类型,无论它是空的(对于任何一个表中的文档编号都不存在),还是只显示一次,如果它存在于
    Custom\u RecDate
    表中,该表是唯一包含项目类型信息的表

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

    谢谢

    顺便说一句,这里是重要的部分(我的查询,尽管在示例中被删减了很多):


    同样,我尝试过使用
    CASE
    语句,并在我的
    WHERE
    子句中放入各种条件,但我就是想不出来。

    纯粹基于示例数据,
    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()所需的

    先生,您是一位绅士和学者。这么简单的解决方案,我简直不敢相信我竟然没有想到!我的查询比我给出的示例稍微复杂一些,但是您的解决方案已经扩展到包含我正在处理的整个查询。非常感谢。谢谢,@marc_s编辑了这个问题。它现在看起来更好了,格式也更好了!:)
    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