【问题标题】:Divide by Subquery returning 'Subquery returned more than 1 value.' error除以返回“子查询返回超过 1 个值”的子查询。错误
【发布时间】:2020-12-24 17:21:08
【问题描述】:

我有下表,其中我有两个销售订单,每个销售订单都有不同的交易数量。

SaleOrder Transaction Amount
S1 T1 20
S1 T2 20
S2 T1 15
S2 T2 15
S2 T3 15

问题是我得到了 SQL Server 表中每个事务的总销售订单金额,而实际上它们需要在事务数中平均分配,如下所示:

SaleOrder Transaction Amount
S1 T1 10
S1 T2 10
S2 T1 5
S2 T2 5
S2 T3 5

我编写了以下查询:

SELECT SalesOrder,
     Transaction,
     Max(Amount) / (SELECT COUNT(Transaction) AS Transaction FROM Test_Table GROUP BY SalesOrder)
    FROM Test_Table
    GROUP BY SalesOrder,
        Transaction

但它给了我'子查询返回超过 1 个值。当子查询跟随=, !=, <, <=, >, >= 或当子查询用作表达式时,这是不允许的。错误。有人可以解释这是什么以及如何纠正这个错误吗?

【问题讨论】:

    标签: sql sql-server tsql subquery division


    【解决方案1】:

    我认为你不需要 group by,只需要窗口函数:

    SELECT SalesOrder, Transaction,
           Amount) / COUNT(*) OVER (PARTITION BY salesorder)
    FROM Test_Table;
    

    【讨论】:

      【解决方案2】:

      由于在子查询中您 GROUP BY SalesOrder 它为每个 SalesOrder 返回 1 行。
      但是您需要特定 SalesOrder 的事务数。
      使用 MAX() 和 COUNT() 窗口函数:

      SELECT DISTINCT SalesOrder, Transaction, 
             MAX(Amount) OVER (PARTITION BY SalesOrder, Transaction) / 
             COUNT(*) OVER (PARTITION BY SalesOrder)
      FROM Test_Table
      

      如果Amount 列的数据类型是INTEGER,那么SQL Server 将执行整数除法,所以你可能需要先乘以1.0,这样才能得到带小数位的正确结果:

      SELECT DISTINCT SalesOrder, Transaction, 
             1.0 * MAX(Amount) OVER (PARTITION BY SalesOrder, Transaction) / 
             COUNT(*) OVER (PARTITION BY SalesOrder)
      FROM Test_Table 
      

      【讨论】:

        【解决方案3】:

        试试这个

        SELECT SaleOrder, [Transaction]
            , Max(Amount) / COUNT([Transaction]) over (partition by SaleOrder)
        FROM Test_Table GROUP BY SaleOrder,[Transaction]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多