【问题标题】:Column Sum in Select Query选择查询中的列总和
【发布时间】:2013-04-03 06:21:57
【问题描述】:

我在 sql server 选择查询中有问题。我有下表。

ID-----Name----Quantity
1-------a-----------10
2-------b-----------30
3-------c-----------20
4-------d-----------15
5-------e-----------10
6-------f-----------30
7-------g-----------40

我想选择那些数量总和

ID-----Name----Quantity
1-------a-----------10
2-------b-----------30
3-------c-----------20

因为如果我们包含下一条记录,那么 Quantity 的总和将为 75。

我想创建这个查询。请帮帮我。

【问题讨论】:

  • Mysql 还是 SQL Server??你为什么用这两个标签来标记它?

标签: sql sql-server sql-server-2008


【解决方案1】:

您可以简单地使用相关子查询来执行此操作,它适用于 MySQL 和 SQL Server。但这不是最好的性能明智的解决方案:

SELECT 
  ID, 
  Name,
  Quantity
FROM
(
  SELECT 
    t1.ID, 
    t1.Name,
    t1.Quantity,
    (SELECT SUM(t2.Quantity)
     FROM tablename AS t2
     WHERE t2.ID <= t1.ID) AS Total
  FROM Tablename AS t1
) AS t
WHERE Total < 65;

查看实际效果:

这会给你:

| ID | NAME | QUANTITY |
------------------------
|  1 |    a |       10 |
|  2 |    b |       30 |
|  3 |    c |       20 |

【讨论】:

    【解决方案2】:

    最佳性能解决方案是使用递归 CTE。

    WITH CTE_Prepare AS
    (
        SELECT 
            *, 
            ROW_NUMBER() OVER (ORDER BY id) AS RN
        FROM TableRT
    )
    , CTE_Recursive AS 
    (
        SELECT  ID, Name, Quantity, QUantity AS SumQuantity, RN FROM CTE_Prepare WHERE RN = 1
        UNION ALL
        SELECT p.ID, p.Name, p.Quantity, r.SumQuantity + p.Quantity AS SumQuantity, r.RN + 1 AS RN FROM CTE_Recursive r
        INNER JOIN CTE_Prepare p ON p.RN = r.RN+1  
        WHERE r.SumQuantity + p.Quantity < 65 
    )
    SELECT * 
    FROM CTE_Recursive 
    OPTION (MAXRECURSION 0)
    

    第一个 CTE 只是计算 ROW_NUMBERS 以代替您的 ID,因为重要的是不要有间隙,而且我们通常无法确定任何 ID 都会出现这种情况。

    第二个 CTE 是两部分递归的,为下一行添加 Quantity。如果需要,您可以通过 Google 搜索更多关于 SQL Server 递归 CTE 的信息。

    我认为这比任何其他查找运行总计的方法更好(这就是这个概念的名称),因为它当时仅适用于两行 - 不会为每个计算添加所有先前的行,并且它实际上会立即停止达到想要的标记。

    SQLFiddle - few rows sample

    SQLFiddle - 10000 rows

    编辑:更正了一些错误。为了使其快速,WHERE 子句需要在 CTE 内部而不是外部。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 2022-10-02
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      相关资源
      最近更新 更多