我有一个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
那么,为什么将我称为多重条件呢?好吧,如果您看这张桌子,我将根据以下内容删除项目:
ItemType
与”DocNumCUSTOM
字段都为NULL,则显示它。ItemType
IS NOT NULL且两个文档编号字段都不为NULL,则显示它。ItemType
IS NULL和DocNumCUSTOM
IS 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
子句中,只是无法弄清楚。
纯粹基于样本数据,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] 删除。
我来说两句