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