不重复值的内联接,保留第一个表的行



我有一个表格,上面有每张发票的折扣。 例如:

Invoice Number|Discount
------------------------
1         |   3
2         |   5
3         |   6

我需要将这些折扣拉到发票行表中(因为它们仅适用于发票总额,而不适用于特定行(。同时我不能失去任何一条线。

示例:如果发票 1 有 5 行,我需要显示所有行(发票的 5 行(,但我只想要一次折扣(例如,第一行就足够了(。

预期:

Invoice Number|Discount
------------------------
1         |   3
1         |   null
1         |   null
1         |   null
1         |   null

如果我有一个Invoice表,并且InvoiceLines表可以通过两个表中的发票编号连接,我如何获得所需的结果?

我尝试了这个查询但没有成功:

Select  
ROW_NUMBER() over(order by v.num_fra)as Rank,
l.*,
v.ctdrap_div as discount 
from ffac_vta v         --(invoicetable)  
join ffac_hla l         --(invoice lines table)
ON v.num_fra = l.num_fra

你可以帮我吗?

这是另一种方法...基本上,您的子查询会提取行项目信息 - 并获取行号(按订单号分区(。 然后,仅当行号 = 1 时,才将该子集LEFT OUTER JOIN到具有折扣值的表中。 此方法不需要CASE语句,因为LEFT OUTER JOIN会为你提供大于 1 的所有行号的NULL值。

SELECT  Sub.*, 
V.ctdrap_div AS [Discount]
FROM 
(
SELECT *,
ROW_NUMBER() OVER(PARTITION BY v.num_fra ORDER BY v.num_fra) AS [Row Number]
FROM ffac_hla L
) Sub
LEFT OUTER JOIN ffac_vta V
ON v.num_fra = Sub.num_fra
AND Sub.[Row Number] = 1

似乎您应该能够将联接更改为左联接。

Select  
ROW_NUMBER() over(order by v.num_fra)as Rank,
l.*,
v.ctdrap_div as discount 
from ffac_vta v         --(invoicetable)  
left join ffac_hla l         --(invoice lines table)
ON v.num_fra = l.num_fra

您需要使用行表的键或其他东西来对行进行排序。像这样的东西。另外,我们在 SQL-Server-2008 中有 ROW_NUMBER(( 吗?

SELECT T.num_fra,
CASE WHEN T.rank = 1 THEN T.Discount
ELSE NULL AS Discount
FROM    
(
Select  
ROW_NUMBER() over(PARTITION BY v.num_fra ORDER BY <<ADD THE KEY OF INVOICE LINES HERE>>)as Rank,
l.*,
v.ctdrap_div as discount 
from ffac_vta v         --(invoicetable)  
join ffac_hla l         --(invoice lines table)
ON v.num_fra = l.num_fra
) AS T

更改为

;WITH cte AS (SELECT DENSE_RANK() over(order by v.num_fra)as Rank,
num_fra,
l.*,
v.ctdrap_div as discount 
FROM ffac_vta v         --(invoicetable)  
JOIN ffac_hla l         --(invoice lines table)
ON v.num_fra = l.num_fra
)
SELECT num_fra
, CASE WHEN Rank = 1 THEN discount ELSE 0 END
, *
FROM cte;

我认为您可以使用左连接... 有关join的更多信息,您可以看到此网站: https://www.quora.com/SQL-What-is-the-difference-between-various-types-of-joins

联接图像之间的差异

我希望这对你有所帮助

试试这个:

select i.InvoiceID,Discount
from invoicedetail i 
left join invoicediscount id on i.invoiceID=id.invoiceid and i.linenumber=1 

相关内容