2016-05-18 97 views
1

我有兩個SQL Server表:ORDR(訂單)和RDR1(訂單的項目)。我試圖創建一個報告,該報告顯示:在SQL Server上連接兩個表

  • DocEntry,CardName,DocDueDate:信息有關訂單
  • P總:項目總金額的順序
  • ItemCode:項目的代碼(它們中的任何,只需要一個)
  • Dscription:項目名稱

我最後的嘗試是:

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的紀錄我有2個問題:

  1. 我得到一個排的每個RDR1記錄
  2. pTot不總結項目

你能告訴我如何正確地加入這些表的金額是多少?

回答

1

您可以使用ROW_NUMBER獲得每個ORDRSUM OVER的第一個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 

此外,您可能希望使用有意義的表別名來提高可讀性。

0

這是我提出的解決方案。

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