【问题标题】:counting using join information使用连接信息进行计数
【发布时间】:2015-12-21 13:48:39
【问题描述】:

我有两张桌子。

一张表记录orderstock,有FK_stockFK_orderNo

我想计算每件库存商品的订单数量。以下代码可以正常工作:

(1)
    SELECT orderstock.FK_orderNo, Count(orderstock.FK_stock) AS CountOfFK_stock
     FROM stock INNER JOIN orderstock ON stock.StockID = orderstock.FK_stock 
    GROUP BY orderdemo.FK_orderNo 

但是,我希望对此进行补充,以便仅列出不易腐烂 (stock.perishable=0) 的库存物品。所以像

SELECT orderstock.FK_orderNo, Count(orderstock.FK_stock) AS CountOfFK_stock 
FROM stock INNER JOIN orderstock ON stock.stockID = orderstock.FK_stock 
WHERE stock.perishable=0 
GROUP BY orderstock.FK_orderNo 

我如何访问与 FK_stock 相关的信息来完成这项工作?当我尝试将库存表中的信息组合到此目的时,每项库存都是单独计算的。

(1) 的结果

 FK_OrderNo     CountOfFK_Stock     
 9      10
104     8
105     3
106     10
107     8
108     10
109     11
110     9

期望的结果(类似):

 FK_OrderNo     CountOfFK_Stock     
 9      7
104     8
105     3
106     4
107     7
108     2
109     11
110     6 

【问题讨论】:

  • 样本数据和预期结果会有所帮助
  • @VR46 好吧,上面列出的所有属性、表名等都是假的,以使问题更具吸引力……
  • 是的,假列名提供了一些数据和预期结果
  • stock.StudentID = orderstock.FK_stock - 您确定将 studentid 与 stockid 匹配是个好主意吗?如果是,那么您的第二个查询似乎是正确的。请描述您收到的任何错误消息或遇到的意外行为,因为我们不知道您的数据库结构和数据。
  • 如果没有源数据(orderstock 和 stock 表),此示例输出将无济于事

标签: mysql sql join count


【解决方案1】:

我猜你在找conditional count

where 子句过滤器移动到Count Aggregate 并使计数聚合仅在stock.perishable = 0 时计数记录。

SELECT orderdemo.fk_orderno, 
       Count(CASE 
               WHEN stock.perishable = 0 THEN 1 
             END) AS nonperishable_count 
FROM   stock 
       INNER JOIN orderdemo 
               ON stock.studentid = orderdemo.fk_stock 
GROUP  BY orderdemo.fk_orderno 

Count 聚合也可以替换为 SUM 聚合。像这样的

   Sum(CASE 
         WHEN stock.perishable = 0 THEN 1 
         ELSE 0 
       END) AS nonperishable_count 

【讨论】:

  • 谢谢,马上试试。
  • 虽然你最终可能是对的,但严格基于问题,这个答案可能不正确。如果您不想对查询返回的所有记录进行计数,无论出于何种原因,您所描述的技术都会很有用。但是,在问题中,仅需要 2 个字段:订单号和满足特定条件的订单项目数。这可以通过过滤 where 中的条件并计算结果来实现。
  • 这2种方式的区别只在处理那些没有符合条件的订单项的订单时可见。使用内部连接过滤 where 条件会看到这些订单从结果集中遗漏,使用您的方法,这些订单将包含在它们旁边显示的 0 中。问题中没有说明这些订单应如何显示在结果中。
猜你喜欢
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 2017-04-06
  • 2020-04-18
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多