2016-03-17 81 views
1

我不能完全得到我的头一轮的SQL语句我尝试写3表按不同的领域连接

伊夫书面发票系统,我想支付的总金额永远发票

我有3个表

InvoiceHeader,InvoiceDetail和交易

两个发票表由一个称为InvoiceRef字段链接。 事务表链接被称为TicketItemID

我允许用户进行对个别发票项目支付,因此也有对单发票单张发票项目

我想显示多笔交易领域invoicedetail支付在invoiceHeader表

下得到发票

select sum(Transactions.Amount) 
from InvoiceDetail 
join Transactions 
on InvoiceDetail.TicketItemID=Transactions.Reference 
where InvoiceDetail.InvoiceRef= '000004' 

但是总支付每张发票的总金额如果我试图把它包含在一个更大的语句中,那么我会得到一个错误。以下是声明

select InvoiceHeader.InvoiceRef, 
InvoiceHeader.CustomerRef, 
InvoiceHeader.CompanyName, 
InvoiceHeader.CreatedOn, 
(SELECT isnull(SUM(InvoiceDetail.Price * InvoiceDetail.Quantity * (InvoiceDetail.VATRate + 1)),0) from InvoiceDetail where InvoiceDetail.InvoiceRef=InvoiceHeader.InvoiceRef) AS InvoiceTotal , 
(SELECT isnull(sum(Amount),0) from Transactions where Reference = InvoiceHeader.InvoiceRef) as AmountPaid, 
    (Select sum(Transactions.Amount) from InvoiceDetail Join(Transactions) on InvoiceDetail.TicketItemID=Transactions.Reference where InvoiceDetail.InvoiceRef=InvoiceHeader.InvoiceRef) as ActualAmount,  
    invoiceheader.paid,  
    InvoiceHeader.Changed,  
    InvoiceHeader.New  
    From InvoiceHeader 

误差

Msg 102, Level 15, State 1, Line 9 
Incorrect syntax near ')'. 
+1

看在这部分'加入(交易)' – sqluser

+0

@sqluser完全错过了thabks – PowerMan2015

回答

2

SELECT子句中使用相关子查询的往往是一个性能问题的原因,所以我会建议一种不同的方式来实现您的查询。需要注意的是左连接你看到下面是使用模仿现有的子查询的作用,这是很有可能你并不需要所有这些为左联接和你应该使用内连接在可能情况下,

SELECT 
     IH.InvoiceRef 
     , IH.CustomerRef 
     , IH.CompanyName 
     , IH.CreatedOn 
     , ISNULL(ID1.InvoiceTotal, 0) AS InvoiceTotal 
     , ISNULL(T.AmountPaid, 0)  AS AmountPaid 
     , ISNULL(ID2.ActualAmount, 0) AS ActualAmount 
     , IH.paid 
     , IH.Changed 
     , IH.New 
FROM InvoiceHeader IH 
     LEFT OUTER JOIN 
     (
       SELECT 
         InvoiceDetail.InvoiceRef 
         , SUM(InvoiceDetail.Price * InvoiceDetail.Quantity * (InvoiceDetail.VATRate + 1)) AS InvoiceTotal 
       FROM InvoiceDetail 
       GROUP BY 
         InvoiceDetail.InvoiceRef 
     ) ID1 ON ID1.InvoiceRef = IH.InvoiceRef 
     LEFT OUTER JOIN 
     (
       SELECT 
         InvoiceDetail.InvoiceRef 
         , SUM(Transactions.Amount) AS ActualAmount 
       FROM InvoiceDetail 
         INNER JOIN Transactions ON InvoiceDetail.TicketItemID = Transactions.Reference 
       GROUP BY 
         InvoiceDetail.InvoiceRef 
     ) ID2 ON ID2.InvoiceRef = IH.InvoiceRef 
     LEFT OUTER JOIN 
     (
       SELECT 
         Reference 
         , SUM(Amount) AS AmountPaid 
       FROM Transactions 
       GROUP BY 
         Reference 
     ) T ON T.Reference = IH.InvoiceRef 
+0

感谢您扩大答案。即使修复是一个错字我实际上实现了这种方法。该查询快速完成两次,更有意义。再次感谢 – PowerMan2015

+0

然后,您可能会考虑指出您选择使用它作为解决方案。这也有助于未来的读者。 –

2

您应该删除周围事务表括号,我相信:

select 
    InvoiceHeader.InvoiceRef, 
    InvoiceHeader.CustomerRef, 
    InvoiceHeader.CompanyName, 
    InvoiceHeader.CreatedOn, 
    (SELECT isnull(SUM(InvoiceDetail.Price * InvoiceDetail.Quantity * (InvoiceDetail.VATRate + 1)),0) 
    from InvoiceDetail where InvoiceDetail.InvoiceRef=InvoiceHeader.InvoiceRef) AS InvoiceTotal , 
    (SELECT isnull(sum(Amount),0) from Transactions 
    where Reference = InvoiceHeader.InvoiceRef) as AmountPaid, 
    (Select sum(Transactions.Amount) from InvoiceDetail Join Transactions 
    on InvoiceDetail.TicketItemID=Transactions.Reference 
    where InvoiceDetail.InvoiceRef=InvoiceHeader.InvoiceRef) as ActualAmount,  
    invoiceheader.paid,  
    InvoiceHeader.Changed,  
    InvoiceHeader.New  
From InvoiceHeader 
+0

错过了。复制它从一个查询窗口到另一个,它自动添加 – PowerMan2015