繁体   English   中英

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

[英]Inner Join without repeating value, keeping the rows of the first table

我有一张桌子,上面有每张发票的折扣。 例如:

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

你能帮助我吗?

这是另一种方法...基本上,您的子查询会提取订单项信息-并获取行号(按订单号划分)。 然后,您LEFT OUTER JOIN子集表与贴现值只有当行数= 1。此方法不需要一个CASE语句,因为LEFT OUTER JOIN会给你NULL以上1中的所有行数的值。

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

您将需要使用lines表的键或某些命令来对行进行排序。 这样的事情。 另外,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;

我认为您可以使用左联接...有关联接的更多信息,您可以访问以下网站: https : //www.quora.com/SQL-What-is-the-difference-between-various-types-of -加入

联接图像之间的区别

希望对您有帮助

尝试这个:

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

暂无
暂无

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

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