【问题标题】:Getting running total in sql [duplicate]在sql中获取运行总计[重复]
【发布时间】:2017-01-03 21:08:41
【问题描述】:

我如何从下面的查询中计算总和

查询

SELECT
  dbo.PurchaseInvoices.PurchaseInvoiceNo as [Invoice No] ,
  dbo.PurchaseInvoices.PurchaseInvoiceDate as [Invoice Date],
  Suppliers.SupplierName,
  dbo.Restaurants.Name as [Restaurant Name],
  CONVERT(decimal(9, 2), SUM(RequisitionDetails.ReceivedQuantity * RequisitionDetails.UnitPrice)) AS Debit
FROM dbo.PurchaseOrders
INNER JOIN dbo.Requisitions
  ON dbo.PurchaseOrders.RequisitionID = dbo.Requisitions.RequisitionID
INNER JOIN dbo.Restaurants
  ON dbo.Requisitions.RestaurantID = dbo.Restaurants.RestaurantID
INNER JOIN dbo.Suppliers
  ON dbo.PurchaseOrders.SupplierID = dbo.Suppliers.SupplierID
INNER JOIN dbo.Categories
  ON dbo.Requisitions.CategoryID = dbo.Categories.CategoryID
INNER JOIN dbo.PurchaseInvoices
  ON dbo.PurchaseOrders.PurchaseOrderID = dbo.PurchaseInvoices.PurchaseInvoiceID
INNER JOIN dbo.RequisitionDetails
  ON dbo.RequisitionDetails.RequisitionID = dbo.Requisitions.RequisitionID
GROUP BY dbo.PurchaseOrders.PurchaseOrderID,
         dbo.Restaurants.Name,
         dbo.PurchaseInvoices.PurchaseInvoiceDate,
         dbo.PurchaseInvoices.PurchaseInvoiceNo,
         Suppliers.SupplierName
ORDER BY dbo.PurchaseInvoices.PurchaseInvoiceNo

查询输出

+------------+--------------+---------------+-----------------+--------+
| Invoice No | Invoice Date | Supplier Name | Restaurant Name |  Debit |
+------------+--------------+---------------+-----------------+--------+
|          1 | 8/26/2016    | supplier1     | restaurant 1    |  92.00 |
|          2 | 8/27/2016    | supplier1     | restaurant 2    |  47.00 |
+------------+--------------+---------------+-----------------+--------+

所需的输出应如下所示

+------------+--------------+---------------+-----------------+--------+---------+
| Invoice No | Invoice Date | Supplier Name | Restaurant Name |  Debit | Balance |
+------------+--------------+---------------+-----------------+--------+---------+
|          1 | 8/26/2016    | supplier1     | restaurant 1    |  92.00 |   92.00 |
|          2 | 8/27/2016    | supplier1     | restaurant 2    |  47.00 |  139.00 |
+------------+--------------+---------------+-----------------+--------+---------+

我怎样才能做到这一点?获得运行总数。

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:

    使用 SUM() OVER( ORDER BY ROWS UNBounded Preceding and Current ROW) 试试下面的 select 语句:

    SELECT
      dbo.PurchaseInvoices.PurchaseInvoiceNo as [Invoice No] ,
      dbo.PurchaseInvoices.PurchaseInvoiceDate as [Invoice Date],
      Suppliers.SupplierName,
      dbo.Restaurants.Name as [Restaurant Name],
      CONVERT(decimal(9, 2), SUM(RequisitionDetails.ReceivedQuantity * RequisitionDetails.UnitPrice)) AS Debit,
      CONVERT(decimal(9,2), SUM(SUM(RequisitionDetails.ReceivedQuantity * RequisitionDetails.UnitPrice)) OVER(ORDER BY dbo.PurchaseInvoices.PurchaseInvoiceNo ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) ) AS Balance
    FROM ...
    

    【讨论】:

    • 问题被标记为SQL SERVER 2008 不支持sum() over(Order by)
    • 我收到此错误 关键字“FROM”附近的语法不正确。
    • 我添加了一个编辑,我认为它缺少 CONVERT() 的右括号。告诉我它是否有效/无效/如果您使用的是SQL Server 2008
    【解决方案2】:

    您可以使用APPLY 运算符或Correlated sub-query 来查找运行总计

    ;with result as 
    (
    SELECT
      dbo.PurchaseInvoices.PurchaseInvoiceNo as [Invoice No] ,
      dbo.PurchaseInvoices.PurchaseInvoiceDate as [Invoice Date],
      Suppliers.SupplierName,
      dbo.Restaurants.Name as [Restaurant Name],
      CONVERT(decimal(9, 2), SUM(RequisitionDetails.ReceivedQuantity * RequisitionDetails.UnitPrice)) AS Debit
    FROM dbo.PurchaseOrders
    INNER JOIN dbo.Requisitions
      ON dbo.PurchaseOrders.RequisitionID = dbo.Requisitions.RequisitionID
    INNER JOIN dbo.Restaurants
      ON dbo.Requisitions.RestaurantID = dbo.Restaurants.RestaurantID
    INNER JOIN dbo.Suppliers
      ON dbo.PurchaseOrders.SupplierID = dbo.Suppliers.SupplierID
    INNER JOIN dbo.Categories
      ON dbo.Requisitions.CategoryID = dbo.Categories.CategoryID
    INNER JOIN dbo.PurchaseInvoices
      ON dbo.PurchaseOrders.PurchaseOrderID = dbo.PurchaseInvoices.PurchaseInvoiceID
    INNER JOIN dbo.RequisitionDetails
      ON dbo.RequisitionDetails.RequisitionID = dbo.Requisitions.RequisitionID
    GROUP BY dbo.PurchaseOrders.PurchaseOrderID,
             dbo.Restaurants.Name,
             dbo.PurchaseInvoices.PurchaseInvoiceDate,
             dbo.PurchaseInvoices.PurchaseInvoiceNo,
             Suppliers.SupplierName
    )
    SELECT * 
    FROM   result a 
           OUTER apply (SELECT Sum([debit]) 
                        FROM   result b 
                        WHERE  a.[invoice no] >= b.[invoice no]) cs (balance) 
    

    不幸的是你还在Sql Server 2008,在Sql Server 2012+我们有Sum() Over(Order by)聚合窗口函数来计算运行,这比上面的方法快得多

    更新:对于SQL SERVER 2012+,请使用此

    ;with result as
    (
    SELECT
      dbo.PurchaseInvoices.PurchaseInvoiceNo as [Invoice No] ,
      dbo.PurchaseInvoices.PurchaseInvoiceDate as [Invoice Date],
      Suppliers.SupplierName,
      dbo.Restaurants.Name as [Restaurant Name],
      CONVERT(decimal(9, 2), SUM(RequisitionDetails.ReceivedQuantity * RequisitionDetails.UnitPrice)) AS Debit
    FROM dbo.PurchaseOrders
    INNER JOIN dbo.Requisitions
      ON dbo.PurchaseOrders.RequisitionID = dbo.Requisitions.RequisitionID
    INNER JOIN dbo.Restaurants
      ON dbo.Requisitions.RestaurantID = dbo.Restaurants.RestaurantID
    INNER JOIN dbo.Suppliers
      ON dbo.PurchaseOrders.SupplierID = dbo.Suppliers.SupplierID
    INNER JOIN dbo.Categories
      ON dbo.Requisitions.CategoryID = dbo.Categories.CategoryID
    INNER JOIN dbo.PurchaseInvoices
      ON dbo.PurchaseOrders.PurchaseOrderID = dbo.PurchaseInvoices.PurchaseInvoiceID
    INNER JOIN dbo.RequisitionDetails
      ON dbo.RequisitionDetails.RequisitionID = dbo.Requisitions.RequisitionID
    GROUP BY dbo.PurchaseOrders.PurchaseOrderID,
             dbo.Restaurants.Name,
             dbo.PurchaseInvoices.PurchaseInvoiceDate,
             dbo.PurchaseInvoices.PurchaseInvoiceNo,
             Suppliers.SupplierName
    )
    SELECT *, sum(Debit) over(Order by [invoice no]) as balance
    FROM   result a 
    

    【讨论】:

    • 我正在使用 Sql Server 2012
    • @Ayman - 那么为什么你的问题被标记为SQL SERVER 2008 :o
    • @Ayman - 检查更新
    • 我收到此错误“结果”附近的语法不正确。
    • 谢谢,但我仍然收到错误
    猜你喜欢
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2010-10-26
    相关资源
    最近更新 更多