【问题标题】:SQL cell equals the sum of a range of cells (same column) when condition is met满足条件时,SQL 单元格等于一系列单元格(同一列)的总和
【发布时间】:2020-03-17 02:54:32
【问题描述】:

当它是相同的帐号时,我正在尝试应用 Buy_Ann 的总和。看起来很简单,但我还没有...

Date    Account     TX_Ann      COF_Ann     Buy_Ann
Jan     01006243    0.02392433  0.02293156  0.00099277
Feb     01006243    0.02392433  0.02392433  0.00000000
Mar     01006243    0.02392433  0.02392433  0.00000000
Feb     01006491    0.02301613  0.01818841  0.00482772
Mar     01006491    0.02301613  0.02301613  0.00000000

我的代码是:

SELECT 
       [Date]
      ,[Account]
      ,[TX_ann]
      ,[CDF_ann]    
      ,(TX_ann-CDF_ann) as Buy_ann 

 FROM [Table1]
 Order by Account

我想要的结果是:(Buy_ann 栏)

 Date   Account     TX_Ann      COF_Ann     Buy_Ann
 Jan    01006243    0.02392433  0.02293156  0.00099277
 Feb    01006243    0.02392433  0.02392433  0.00099277
 Mar    01006243    0.02392433  0.02392433  0.00099277
 Feb    01006491    0.02301613  0.01818841  0.00482772
 Mar    01006491    0.02301613  0.02301613  0.00482772

我尝试了以下代码:

SELECT TOP 1000 
       [Date]
      ,[Account]
      ,[TX_ann]
      ,[CDF_ann]    
      ,(Select TOP 1000 Sum(TX_ann-CDF_ann) 
       FROM Table1 Group by Account)) as Buy_ann 
 FROM [Table1]
 Order by Account

这是我得到的错误消息:子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

我知道出了什么问题,但我真的不知道如何解决它。

为了提供更多详细信息,特定帐号在 Buy_ann 列中将只有一行具有不同于零的值(由于对 COF_ann 列进行了一次费率调整)。问题是,如果不查看数据,我永远不知道它是哪一行(这就是为什么我试图将总和的值赋予具有相同帐号的所有行)。我想可能还有其他可能更有效的方法。

提前致谢, 奥黛丽·博多安

【问题讨论】:

    标签: sql select subquery


    【解决方案1】:

    请尝试查询:

    SELECT [Date]
          ,[Account]
          ,SUM(TX_ann) as TX_ann
          ,SUM(CDF_ann) as CDF_ann
          ,(SUM(TX_ann)-SUM(CDF_ann)) as Buy_ann 
     FROM [Table1]
     GROUP BY Date, Account
     Order by Date, Account
    

    【讨论】:

      【解决方案2】:

      快到了!将GROUP BY 语句移出。
      您想按Account 分组并在Buy_Ann 列上进行操作。

      SELECT 
          [Account], 
          SUM((TX_ann-CDF_ann)) AS Buy_Ann 
      FROM [Table1] 
      GROUP BY [Account]
      

      使用SUM 聚合由Account 分组的列将为您提供结果。

      然后您可以从这里使用 do ORDER BYTOP1000 等进行编辑。

      ---------编辑------------

      在这种情况下,您的答案仍然很接近。原因是求和列返回所有结果(就像我上面的解决方案一样),您必须过滤它们以等于您的外行 Account

      SELECT 
          [Account], 
          [egCol1],
          [egCol2],
          (
              SELECT SUM((TX_ann-CDF_ann)) 
              FROM [Table1] as t1
              GROUP BY [Account]
              HAVING t1.Account = t2.Account
          ) AS Buy_Ann 
      FROM [Table1] as t2
      

      【讨论】:

      • @AudreyBeaudoin 从您试图达到的结果来看,Buy_Ann 列实际上是为同一个帐户重复的,是否需要显示?如果您只需要每个 Account 拥有的记录数,您可以添加 count(*) 作为第三个选择列。
      • 嗨@jackc感谢您的回答,代码有效,但它只保留不同的行 Account TX_Ann COF_Ann Buy_Ann 01006243 0.02392433 0.02392433 0.00099277 01006491 0.02301613 0.01818841 0.00482完全一样。
      • 是的,很抱歉没有解释。这是因为还有其他列我没有在上面的代码中写,因为太多了。我刚刚添加了日期列。我真的需要所有帐号的每个日期的 Buy_ann 的所有值。
      • @AudreyBeaudoin 我已经编辑了答案,现在看看。
      • 或者如果您只需要按日期对它们进行分组,jainvikram444 的答案会更简洁。
      猜你喜欢
      • 2019-04-24
      • 2018-07-03
      • 2017-02-04
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      相关资源
      最近更新 更多