0

我有以下三个表

文件表

FileId
FileNo

付款表

  Id
  Amount
  FK_FileID

费用表

  Id
  Amount
  FK_FileID

我想要像这样的输出

FileNo Payment_Amount Expense_Amount
10001         220          150
10001         120          NULL
10001         150          NULL

我想检索文件支付和费用数据。我发现了 1 条费用记录和 3 条付款记录,因此费用的另一行包括 null,反之亦然

我怎样才能??

4

2 回答 2

0

使用以下查询...

Select f.FileNo,p.Amount as Payment_Amount,e.Amount as Expense_Amount From File f inner   join        Payment p ON f.FileId = p.FK_FileID inner join Expense e on  e.FileId = p.FK_FileID
于 2012-08-07T08:17:03.873 回答
0

我相信以下应该得到你想要的,它有点奇怪,但由于付款和费用之间没有关系,所以你必须分开做然后加入。您可以使用子 SELECT 语句来执行此操作,但我使用临时表是为了便于阅读。

SELECT              F.FileNo, F.FileId, P.Amount, 
                    ROW_NUMBER() OVER (PARTITION BY P.FileId order by P.Id) AS Row  
INTO                #Payments
FROM                File F
INNER JOIN          Payment P ON F.FileId = P.FileId

SELECT              F.FileNo, F.FileId, E.Amount, 
                    ROW_NUMBER() OVER (PARTITION BY E.FileId order by E.Id) AS Row  
INTO                #Expenses
FROM                File F
INNER JOIN          Expense E ON F.FileId = E.FileId

SELECT              COALESCE(tP.FileNo, tE.FileNo) AS FileNo,
                    tP.amount AS Payment_Amount,
                    tE.amount AS Expense_Amount 
FROM                #Payments tP
FULL JOIN           #Expenses tE ON tP.FileId = tE.FileId AND tP.Row = tE.Row

我已经使用 ROW_NUMBER() 来获取一个数字,该数字取决于可能属于给定文件的每个付款和费用记录的 FileID。然后,我在 FULL JOIN(以及 FileID)中加入这些值,以便只加入一个实例,这消除了三个表之间的正常 INNER JOIN 会导致的问题。

排序可能是一个问题,因为它取决于哪个表(付款或费用)的记录​​最多。

当你测试它时让我知道它是如何进行的。

于 2012-08-07T12:51:16.933 回答