【问题标题】:Selecting count with other columns through joined tables (Oracle SQL)通过连接表选择其他列的计数(Oracle SQL)
【发布时间】:2020-03-12 15:44:02
【问题描述】:

我有以下查询返回库存商品的订单数:

select count(Orders.OrderID) from Stocks, Orders
where Stocks.StockID = Orders.StockID(+) group by Stocks.StockID;

这会返回:

count(Orders.OrderID)
---------------------
0
1
2
0
1
...

但是,我还想在此查询旁边显示特定库存商品的名称。到目前为止,我已经尝试过了,但是出现以下错误...

select Stocks.Name, count(Orders.OrderID) from Stocks, Orders
where Stocks.StockID = Orders.StockID(+) group by Stocks.StockID;

出现以下错误:

select Stocks.Name, count(Orders.OrderID) from Stocks, Orders
       *
Error: not a GROUP BY expression.

这应该返回:

Name        count(Orders.OrderID)
----------  ---------------------
Item1       0
Item2       1
Item3       2
Item4       0
Item5       1
.....       ...


有人可以帮忙吗?提前致谢。

【问题讨论】:

    标签: sql oracle select count


    【解决方案1】:

    应该是这样的:

    select Stocks.StockID,Stocks.Name, count(Orders.OrderID) 
    from Stocks
    left join Orders
      on Stocks.StockID = Orders.StockID  -- explicit outer join syntax
    group by Stocks.StockID,Stocks.Name;  -- matching with select column list
    

    【讨论】:

    • 非常感谢!这似乎是最简单的解决方案。
    【解决方案2】:

    我建议你使用 COUNT 解析函数:

    SELECT DISTINCT s.NAME,
           COUNT(*) OVER (PARTITION BY s.STOCKID ORDER BY s.STOCKID) AS ON_ORDER
      FROM STOCKS s
      LEFT OUTER JOIN ORDERS o
        ON s.STOCKID = o.STOCKID
    

    dbfiddle here

    【讨论】:

      【解决方案3】:

      另一种选择如下;

      SELECT S.StockID, S.Name, Orders.[Count]
      FROM Stocks AS S
          CROSS APPLY
          ( SELECT COUNT(*) AS [Count]
            FROM Orders AS O
            WHERE S.StockID = O.StockID
          ) AS Orders
      

      :)

      【讨论】:

      【解决方案4】:

      根据您的描述,您似乎希望为每个股票名称报告一个汇总行,或者换句话说,按股票名称分组:

      select s.name as stock_name, count(o.orderid) as orders
      from   stocks s
             left join orders o
                  on  o.stockid = s.stockid
      group by s.name;
      

      这将给出类似的结果

      STOCK_NAME  ORDERS
      ----------- ------
      X              123
      Y               45
      Z                6
      

      如果需要,您可以包含 Stocks 中的其他列,例如 Stock ID:

      select s.stockid, s.name as stock_name, count(o.orderid) as orders
      from   stocks s
             left join orders o
                  on  o.stockid = s.stockid
      group by s.stockid, s.name;
      

      这将给出类似的结果

      STOCKID  STOCK_NAME  ORDERS
      -------- ----------- ------
      1        X              123
      2        Y               45
      3        Z                6
      

      【讨论】:

        猜你喜欢
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多