从另一个多行表中添加 1 列

问题描述 投票:0回答:1

我有一个包含发票的 SQL Server 表和另一个包含发票行的表。我试图在行中获取

Price
金额以添加到我的查询中。我的数据看起来像这样(简化为每个表中有数十列和数千行)

Invoice
表:

InvNumber | ShipCost
----------+---------
 1        |  500
 2        |  1000

Invoice_line
表:

InvNumber  | Product | GL | Price
-----------+---------+----+------
1          |  ABC    | 2  | 10
1          |   Z     | 1  | 50
2          |   X     | 2  | 15

我需要获取一个查询,该查询将根据 GL 帐户获取发票行表上的价格并将其添加到我的查询中,因此在我的示例中,如果 GL 为 1,我需要将该价格添加到我的查询中。

我用

LEFT JOIN
创建了一个查询,但是当我使用它时,它创建了一条价格为
NULL
的行和另一行,所以我错过了一些东西

这是我的疑问:

SELECT DISTINCT
    InvNumber, 
    ShipCost,
    CASE
        WHEN Invoice_line.GL = '1' 
            THEN Invoice_line.Price 
            ELSE NULL
    END AS Price
FROM 
    Invoice
LEFT JOIN 
    Invoice_line ON Invoice.InvNumber = Invoice_line.InvNumber

这是我现在得到的结果:

InvNumber | ShipCost | Price
----------+----------+-------
 1        |  500     | 50
 1        |  500     | NULL
 2        |  1000    | NULL

预期结果

InvNumber | ShipCost | Price
----------+----------+-------
 1        |  500     | 50
 2        |  1000    | NULL

我尝试了

SELECT DISTINCT
,但这并没有改变任何东西。

也玩过不同类型的 JOIN,但没有给我带来我所期待的

不确定我缺少什么来获得我正在寻找的结果

sql-server join
1个回答
0
投票

选项 1(如果我们可以假设每张发票只有 1 个总帐行)

SELECT 
    InvNumber, 
    ShipCost,
    Invoice_line.Price AS Price
FROM 
    Invoice
LEFT JOIN  Invoice_line 
  ON Invoice.InvNumber = Invoice_line.InvNumber
 and Invoice_Line.GL = '1'

选项 2(如果发票可以有多行 GL 1,那么我们需要求和)

SELECT 
    InvNumber, 
    ShipCost,
    sum(Invoice_line.Price) AS Price
FROM 
    Invoice
LEFT JOIN  Invoice_line 
  ON Invoice.InvNumber = Invoice_line.InvNumber
 and Invoice_Line.GL = '1'
GROUP BY InvNumber, ShipCost

选项 3)我们可以进行内联选择,因为我们只在 1 个字段之后。

SELECT 
    InvNumber, 
    ShipCost,
    (SELECT SUM(coalesce(Invoice_line.Price,0))
     FROM Invoice_Line) AS Price
     WHERE Invoice.InvNumber = Invoice_line.InvNumber
       and Invoice_Line.GL = '1') as Price
FROM Invoice
© www.soinside.com 2019 - 2024. All rights reserved.