sql-server - 如何在每个发票编号的多个项目中使用 GROUP by?
问题描述
主表包含一系列具有多个项目的发票。
显然,如果一张发票有多个项目,结果会为同一个发票编号产生多条记录。因此,金额的总和包括同一发票编号的多次重复。
一直在绞尽脑汁来制造一个 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
解决方案
正如@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
推荐阅读
- php - 仅当在 Woocommerce 中应用优惠券时才允许购买特定产品
- c++ - Read access violation in matrix
- python-3.x - Python 函数的 return 语句如何像 print(argument, end='') 一样将字符串保持在同一行?
- sql - 如何最小化事务日志 sqlserver 数据库。?
- javascript - JavaScript setTimeout() 函数不适用于“onsubmit”表单属性
- python - 通过 2 个 ForeignKeys 在 django 中加入模型
- c - 分叉的孩子“打印”两次重定向标准输出
- python - 如何将 2 个不同的模型与“中间模型”结合起来?
- r - 为什么我得到带有 naiveBayes 函数的未定义列?
- javascript - iOS 12 中的 PWA 在重新打开应用程序时不再重新执行 Javascript