1

我对 SQL Server 相当陌生,并试图做一些看起来应该相当基本的事情,但我一定错过了一个重要的概念。

首先,这是故事:

  • 我有表 X,其中包含订单中的行项目
  • 我有表 Y,其中包含订单本身

我想将订单项数除以订单数,从而生成平均订单的订单项数。

我尝试了几个选项:

  1. 我尝试将两个表连接在一起,然后将 X 的 count() 除以 Y 的计数。不幸的是,通过 X 到 Y 它为每个 Y 创建一个条目,因此除法的结果是一个。

    select count(x) / count (y) 
    from x 
    join y
    
  2. 我尝试通过计算“不同”订单而不是不同的订单项来使选择语句的一半“不同”。事实证明,您不能使选择语句的一半不同。

    select count(x) / distinct count (y) 
    from x 
    join y
    
  3. 我尝试制作一个新表,并将订单数的总和输出到新表中。然后我尝试将行项目数除以该表的值。除非我将表格连接在一起,否则这不起作用,这让我回到了原来的问题。

    select count(x) / temptable
    from x
    join temptable
    
  4. 我尝试查找如何将SQL语句输出到变量,以便我可以使用该变量进行除法,但无处可去。

  5. 我已经仔细阅读了许多暗示这个问题但实际上并没有解决它的堆栈溢出帖子。

任何帮助将不胜感激!

4

2 回答 2

2
SELECT AVG(1.0 * line_item_count) 
FROM (
  SELECT order_id, COUNT(*) as line_item_count
  FROM line_items
  GROUP BY order_id
) line_item_counts
于 2012-11-08T22:50:59.460 回答
1

最简单的方法是不使用子查询:

select count(*) * 1.0 / count(distinct order_id)
from line_items

这假设所有订单至少有一个订单项。如果不是这种情况,您可以这样做:

select count(*) * 1.0 / (select count(*) from orders)
from line_items

或者,如果您不喜欢select子句中的子查询,您可以改用连接:

select count(li.line_item_id)*1.0/count(distinct o.order_id)
from orders o left outer join
     line_items li
     on o.order_id = li.order_id
于 2012-11-08T22:54:39.310 回答