主表包含一系列包含多个项目的发票。
很显然,如果发票包含多个项目,则结果将为同一发票编号生成多个记录。因此,金额的总和包含相同发票编号的多次重复。
尽力制作一个SQL查询以同时创建一个发票编号,即使它具有不同的行项目也是如此。
有什么想法吗? 当前结果如下:
但是它应该在发票编号下仅1行。
我得到的代码是:
SELECT
STUFF(dbo.Invoice.CustomerPO, 1, 2, '') AS [Customer PO],
'' AS Blank,
ISNULL(dbo.Invoice.CredInvoiceNo, dbo.Invoice.InvoiceNo) AS [Invoice Number],
dbo.InvoiceDetails.ExtendedPrice AS Net,
dbo.InvoiceDetails.TotalTaxes AS GST,
dbo.InvoiceDetails.ExtendedPrice + dbo.InvoiceDetails.TotalTaxes AS Gross,
dbo.Invoice.EntryDate AS [Invoice Date],
dbo.Invoice.InvoiceID,
dbo.Customers.CustomerID,
dbo.ItemSpecs.ItemSpecID
FROM
dbo.SalesOrder WITH (NOLOCK)
RIGHT OUTER JOIN dbo.CustomerBillTo
RIGHT OUTER JOIN dbo.GLAccounts AS GLAccounts_1
RIGHT OUTER JOIN dbo.GLAccounts AS GLAccounts_2
RIGHT OUTER JOIN dbo.Customers WITH (NOLOCK)
LEFT OUTER JOIN dbo.Territories WITH (NOLOCK) ON dbo.Customers.TerritoryID = dbo.Territories.TerritoryID
RIGHT OUTER JOIN dbo.Invoice WITH (NOLOCK) ON dbo.Customers.CustomerID = dbo.Invoice.CustomerID
INNER JOIN dbo.InvoiceDetails WITH (NOLOCK)
LEFT OUTER JOIN dbo.UOMs WITH (NOLOCK) ON dbo.InvoiceDetails.PriceUOMID = dbo.UOMs.UOMID
LEFT OUTER JOIN dbo.SalesOrderDetails WITH (NOLOCK) ON dbo.InvoiceDetails.SalesOrderDetailID = dbo.SalesOrderDetails.SalesOrderDetailID ON dbo.Invoice.InvoiceID = dbo.InvoiceDetails.InvoiceID ON GLAccounts_2.GLAccountID = dbo.InvoiceDetails.CogsGLAccountID ON GLAccounts_1.GLAccountID = dbo.InvoiceDetails.InvGLAccountID
LEFT OUTER JOIN dbo.GLAccounts
LEFT OUTER JOIN dbo.CurrencyCodes ON dbo.GLAccounts.CurrencyCodeID = dbo.CurrencyCodes.CurrencyCodeID ON dbo.InvoiceDetails.SalesGLAccountID = dbo.GLAccounts.GLAccountID ON dbo.CustomerBillTo.CustomerBillToID = dbo.Invoice.CustomerBillToID ON dbo.SalesOrder.SalesOrderID = dbo.SalesOrderDetails.SalesOrderID
LEFT OUTER JOIN (
SELECT
dbo.ARPaymentDetails.InvoiceID,
MAX(dbo.ARPayment.EntryDate) AS LastPaymentDate
FROM
dbo.ARPaymentDetails
INNER JOIN dbo.ARPayment ON dbo.ARPaymentDetails.ARPaymentID = dbo.ARPayment.ARPaymentID
WHERE
(dbo.ARPayment.Posted = 1)
GROUP BY
dbo.ARPaymentDetails.InvoiceID
) AS ARPayments ON dbo.Invoice.InvoiceID = ARPayments.InvoiceID
LEFT OUTER JOIN dbo.listToTable(
'Partially Shipped,Partially Shipped and/or Partially Invoiced,Shipped,Shipped + Partially Invoiced,Invoiced,Cancelled',
','
) AS SalesOrderStatus ON dbo.SalesOrderDetails.SOStatus = SalesOrderStatus.Position
LEFT OUTER JOIN dbo.ItemSpecs WITH (NOLOCK) ON dbo.InvoiceDetails.ItemSpecID = dbo.ItemSpecs.ItemSpecID
LEFT OUTER JOIN dbo.ShippingDetails WITH (NOLOCK) ON dbo.InvoiceDetails.ShippingDetailID = dbo.ShippingDetails.ShippingDetailID
LEFT OUTER JOIN dbo.SalesReps WITH (NOLOCK) ON dbo.SalesOrder.SalesRepID = dbo.SalesReps.SalesRepID
LEFT OUTER JOIN dbo.Shipping WITH (NOLOCK) ON dbo.ShippingDetails.ShippingID = dbo.Shipping.ShippingID
WHERE
(dbo.Customers.CustomerNo = 'omx')
GROUP BY
dbo.Invoice.CredInvoiceNo,
dbo.Invoice.InvoiceNo,
STUFF(dbo.Invoice.CustomerPO, 1, 2, ''),
dbo.InvoiceDetails.ExtendedPrice,
dbo.InvoiceDetails.TotalTaxes,
dbo.InvoiceDetails.ExtendedPrice + dbo.InvoiceDetails.TotalTaxes,
dbo.Invoice.EntryDate,
dbo.Invoice.InvoiceID,
dbo.Customers.CustomerID,
dbo.ItemSpecs.ItemSpecID
ORDER BY
[Invoice Number] DESC
答案 0 :(得分:0)
如@ZLK所建议,如果您在分组依据中取出涉及InvoiceDetail的任何内容,并在选择列表中的每个InvoiceDetail列周围添加sum(),那么您将得到所需的内容。
所以选择列表如下:
SELECT STUFF(dbo.Invoice.CustomerPO, 1, 2, '') AS [Customer PO], '' AS Blank, ISNULL(dbo.Invoice.CredInvoiceNo, dbo.Invoice.InvoiceNo) AS [Invoice Number],
sum(dbo.InvoiceDetails.ExtendedPrice AS Net,
sum(dbo.InvoiceDetails.TotalTaxes) AS GST,
sum(dbo.InvoiceDetails.ExtendedPrice + dbo.InvoiceDetails.TotalTaxes) AS Gross,
dbo.Invoice.EntryDate AS [Invoice Date], dbo.Invoice.InvoiceID, dbo.Customers.CustomerID,
和分组依据:
GROUP BY ISNULL(dbo.Invoice.CredInvoiceNo, dbo.Invoice.InvoiceNo), STUFF(dbo.Invoice.CustomerPO, 1, 2, ''),
dbo.Invoice.EntryDate, dbo.Invoice.InvoiceID, dbo.Customers.CustomerID