连接SQL Server上的两个表

连接SQL Server上的两个表,sql,sql-server,join,Sql,Sql Server,Join,我有两个SQL Server表:ORDR(订单)和RDR1(订单的项目)。我正在尝试创建一个报告,其中显示: DocEntry、CardName、DocDueDate:有关订单的信息 pTot:订单中的项目总数 ItemCode:项目的代码(其中任何一个,只需要一个) DScript:项目的名称 我最后一次尝试是: SELECT dbo.ORDR.DocEntry, dbo.ORDR.CardName, dbo.ORDR.DocDueDate, SUM(dbo.RDR1.Q

我有两个SQL Server表:
ORDR
(订单)和
RDR1
(订单的项目)。我正在尝试创建一个报告,其中显示:

  • DocEntry、CardName、DocDueDate:有关订单的信息
  • pTot:订单中的项目总数
  • ItemCode:项目的代码(其中任何一个,只需要一个)
  • DScript:项目的名称
我最后一次尝试是:

SELECT 
    dbo.ORDR.DocEntry, dbo.ORDR.CardName, dbo.ORDR.DocDueDate,
    SUM(dbo.RDR1.Quantity) AS pTot,
    dbo.RDR1.ItemCode,
    dbo.RDR1.Dscription
FROM 
    dbo.ORDR 
INNER JOIN
    dbo.RDR1 ON dbo.ORDR.DocEntry = dbo.RDR1.DocEntry
GROUP BY 
    dbo.ORDR.DocEntry, dbo.ORDR.CardName, dbo.ORDR.DocDueDate, 
    dbo.RDR1.ItemCode, dbo.RDR1.Dscription
一个订单中的项目代码/名称非常相似,因此我只需要与该订单关联的第一个RDR1记录

我有两个问题:

  • 我将为每个RDR1记录获取一行
  • pTot
    不是对项目数量求和

  • 您能告诉我如何正确地联接这些表吗?

    您可以使用
    行数
    为每个
    ORDR
    获取第一个
    RDR1
    项目,并使用
    求和
    获取项目总数

    SELECT
        o.DocEntry,
        o.CardName,
        o.DocDueDate,
        r.pTot,
        r.ItemCode,
        r.Dscription
    FROM dbo.ORDR o
    INNER JOIN (
        SELECT *,
            rn = ROW_NUMBER() OVER(PARTITION BY DocEntry ORDER BY ItemCode),
            pTot = SUM(Quantity) OVER(PARTITION BY DocEntry)
        FROM dbo.RDR1   
    ) r
        ON r.DocEntry = o.DocEntry
    WHERE r.rn = 1
    

    此外,您可能希望使用有意义的表别名来提高可读性。

    以下是我建议的解决方案

    SELECT 
        [rowno] = ROW_NUMBER() OVER(PARTITION BY DocEntry ORDER BY ItemCode),
        O.DocEntry, 
        O.CardName, 
        O.DocDueDate,
        SUM(Quantity) AS pTot,
        O.ItemCode,
        O.Dscription
    INTO #TEMP_ORDER
    FROM dbo.ORDR O
    INNER JOIN dbo.RDR1 R
        ON O.DocEntry = dbo.RDR1.DocEntry
    GROUP BY O.DocEntry, O.CardName, O.DocDueDate, R.ItemCode, R.Dscription
    
    SELECT 
        DocEntry, 
        CardName, 
        DocDueDate,
        pTot,
        ItemCode,
        Dscription
    FROM #TEMP_ORDER
    WHERE roWno = 1
    
    DROP TABLE #TEMP_ORDER