繁体   English   中英

合并查询

[英]Consolidating Queries

我试图了解当查询之一返回多个记录时如何组合查询。

这是一个发票报告,我要在其中输入要发票的产品的序列号。 我将尽可能简化该脚本以进行澄清。 这是添加序列号之前的脚本:

   SELECT ARM.fcustno AS [Cust No]
,      ARM.fbcompany AS [Cust Name]
,      ARM.fcinvoice AS [Invoice No]
,      ARM.fdgldate AS [Post Date]
,      ARI.fitem AS [Item No]
,      ARI.fprodcl AS [Prod Class]
,      ARI.fshipkey AS [Qty Invoiced]
,      ARI.fpartno AS [Part No]
,      ARI.frev AS [Part Rev]
,      ARI.FTOTPRICE AS [Net Invoiced]
,      ARM.fsono AS [Sales No]
,      SOM.fcusrchr2
FROM dbo.armast ARM
INNER JOIN dbo.aritem ARI ON ARM.FCINVOICE = ARI.FCINVOICE
INNER JOIN slcdpm SLC ON SLC.fcustno = ARM.fcustno
LEFT OUTER JOIN slcdpm_ext SLCE ON SLC.identity_column = SLCE.fkey_id
LEFT OUTER JOIN somast SOM ON SOM.fsono = ARM.fsono

这将返回已开具发票的订单项及其价格等。 当我输入以下内容时:

SELECT ARM.fcustno AS [Cust No]
,      ARM.fbcompany AS [Cust Name]
,      ARM.fcinvoice AS [Invoice No]
,      ARM.fdgldate AS [Post Date]
,      ARI.fitem AS [Item No]
,      ARI.fprodcl AS [Prod Class]
,      ARI.fshipkey AS [Qty Invoiced]
,      ARI.fpartno AS [Part No]
,      ARI.frev AS [Part Rev]
,      ARI.FTOTPRICE AS [Net Invoiced]
,      ARM.fsono AS [Sales No]
,      SOM.fcusrchr2
,      LOTC.fcuseinlot 
FROM dbo.armast ARM
INNER JOIN dbo.aritem ARI ON ARM.FCINVOICE = ARI.FCINVOICE
INNER JOIN slcdpm SLC ON SLC.fcustno = ARM.fcustno
LEFT OUTER JOIN slcdpm_ext SLCE ON SLC.identity_column = SLCE.fkey_id
LEFT OUTER JOIN somast SOM ON SOM.fsono = ARM.fsono

--** New stuff below: ******
LEFT OUTER JOIN ShItem SHI ON SHI.fShipNo + SHI.fItemNo = ARI.fShipKey
LEFT OUTER JOIN ShSrce ON ShSrce.fcShipNo = SHI.fShipNo
                      AND ShSrce.fcItemNo = SHI.fItemNo
LEFT OUTER JOIN QaLotC LOTC ON LOTC.fcUseInDoc = ShSrce.fcShipNo + ShSrce.fcItemNo + ShSrce.fcSrcItmNo

问题是每个发票可能有多个SHSRCE记录。 处理此问题的最佳方法是什么? 也许使用子查询来连接LOTC.fcuseinlot字段,以便为每条记录返回一个对应的值。

为了明确起见,该附加查询为每个订单项发票返回多于1条记录,因为可以在一个订单项上开具多个序列号发票。 理想情况下,我希望将它们串联起来(例如NCC1701,R2D2,C3PO)等。这就是为什么我考虑使用子查询来串联它们。

仍在等待OP澄清问题,但是如果多个SHSRCE记录仍然仅与一个序列号相关(我想这是在LOTC.fcuseinlot中)

SELECT
    ARM.fcustno AS [Cust No] ,
    ARM.fbcompany AS [Cust Name] ,
    ARM.fcinvoice AS [Invoice No] ,
    ARM.fdgldate AS [Post Date] ,
    ARI.fitem AS [Item No] ,
    ARI.fprodcl AS [Prod Class] ,
    ARI.fshipkey AS [Qty Invoiced] ,
    ARI.fpartno AS [Part No] ,
    ARI.frev AS [Part Rev] ,
    ARI.FTOTPRICE AS [Net Invoiced] ,
    ARM.fsono AS [Sales No] ,
    SOM.fcusrchr2,
       MAX(LOTC.fcuseinlot)
FROM
    dbo.ARMAST ARM 
JOIN dbo.aritem ARI ON  ARI.FCINVOICE = ARM.FCINVOICE 
JOIN slcdpm SLC ON  SLC.fcustno = ARM.fcustno
LEFT JOIN slcdpm_ext SLCE ON  SLCE.fkey_id = SLC.identity_column
LEFT JOIN somast SOM ON  SOM.fsono = ARM.fsono
LEFT JOIN ShItem SHI ON  SHI.fShipNo + SHI.fItemNo = ARI.fShipKey
LEFT JOIN ShSrce ON  ShSrce.fcShipNo = SHI.fShipNo AND ShSrce.fcItemNo = SHI.fItemNo
LEFT JOIN QaLotC LOTC ON  LOTC.fcUseInDoc = ShSrce.fcShipNo + ShSrce.fcItemNo + ShSrce.fcSrcItmNo
GROUP BY
    ARM.fcustno ,
    ARM.fbcompany ,
    ARM.fcinvoice ,
    ARM.fdgldate ,
    ARI.fitem ,
    ARI.fprodcl ,
    ARI.fshipkey ,
    ARI.fpartno ,
    ARI.frev ,
    ARI.FTOTPRICE ,
    ARM.fsono ,
    SOM.fcusrchr2

您可以发布一些样本数据吗?

如果我说对了,请看看这种sql

create table tableA (id int, ref varchar(50))

insert into tableA
select 1, 3536757616
union select 1, 3536757617
union select 1, 3536757618
union select 2, 3536757628
union select 2, 3536757629
union select 2, 3536757630

我知道我可以通过使用串联引用

SELECT distinct
    id,
    stuff ( ( SELECT
                  '/ ' + ref 
              FROM
                  tableA tableA_1
              where tableA_1.id = tableA_2.id
    FOR XML PATH ( '' ) ) , 1 , 2 , '' )
from TableA tableA_2

1   3536757616/ 3536757617/ 3536757618
2   3536757628/ 3536757629/ 3536757630

合并查询? 就像工会一样吗?

我们真正需要知道的是,您将使用什么依据来选择哪些可能的记录中要返回的值? 那将为您确定最佳的可能性。

而且,由于您没有添加任何列并且使用的是左联接(因此不会从联接中排除任何记录),除了延长处理时间外,通过添加这些联接可以达到什么目的?

您的问题上有一个SQL Server 2000标记,所以我不确定这对您是否可行。 在SQL Server 2005及更高版本中,您可以创建自定义聚合函数。 我使用一个聚合函数FormDelimitedString ,它完全可以满足您的需求。

有一个页面在这里介绍如何实现这个功能-它被写成一个.NET程序集,然后从查询中执行。 有了这个,您的查询将变成...

SELECT ARM.fcustno AS [Cust No]
,      ARM.fbcompany AS [Cust Name]
-- (a few fields skipped for brevity)
,      SOM.fcusrchr2
-- Aggregate function will combine multiple values into a single string - 'value1, value2, value3' etc
,   dbo.FormDelimitedString(LOTC.fcuseinlot) AS ConcatenatedValues
FROM dbo.armast ARM
INNER JOIN dbo.aritem ARI ON ARM.FCINVOICE = ARI.FCINVOICE
INNER JOIN slcdpm SLC ON SLC.fcustno = ARM.fcustno
LEFT OUTER JOIN slcdpm_ext SLCE ON SLC.identity_column = SLCE.fkey_id
LEFT OUTER JOIN somast SOM ON SOM.fsono = ARM.fsono
LEFT OUTER JOIN ShItem SHI ON SHI.fShipNo + SHI.fItemNo = ARI.fShipKey
LEFT OUTER JOIN ShSrce ON ShSrce.fcShipNo = SHI.fShipNo
                      AND ShSrce.fcItemNo = SHI.fItemNo
LEFT OUTER JOIN QaLotC LOTC ON LOTC.fcUseInDoc = ShSrce.fcShipNo + ShSrce.fcItemNo + ShSrce.fcSrcItmNo

-- Group by clause needed as its an aggregate function
GROUP BY ARM.fcustno, ARM.fbcompany, SOM.fcusrchr2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM