2017-07-18 80 views
1

我有一個表,每個發票的折扣。例如:內部加入不重複值,保留第一個表的行

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 

你能幫助我嗎?

回答

0

看起來你應該能夠將你的連接變成左連接。

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 
+0

這將返回所有記錄的折扣,無論其等級如何,這不是OP所要求的。 –

-2

試試這個:

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

折扣不是我不會懷疑的列名,因爲原始查詢會將該列命名爲此名稱。 – scsimon

+0

OP可以找出如何應用它。邏輯是正確的。如果LineNumber不在1處重新啓動,那麼Wendy的解決方案是正確的(除OP需要null而不是0) – KeithL

+1

此外,'LineNumber'不是列 - 否則不需要獲取row_number。 –

0

您需要使用您的線路表或某事的關鍵,爲了你的行。像這樣的東西。另外,我們在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 
+1

謝謝!是的,我使用了Row_Number() – Jordi

0

更改爲

;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; 
0

我想你可以使用左連接... 更多有關加入,你可以看到這個網站:https://www.quora.com/SQL-What-is-the-difference-between-various-types-of-joins

difference between join image

我希望這可以幫到你

+2

因爲這不是一個答案,所以最好留下來作爲評論。答案應包括一個工作解決方案和解釋。此外,在鏈接到外部網站時,應在此處複製並粘貼相關資料以在外部網頁被移除時保留信息。 –

1

這是另一種方法...基本上,您的子查詢會拉出行項目信息 - 並獲取行號(按訂單號分區)。然後,你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 
+1

謝謝,這很有幫助! – Jordi

相關問題