跨多个表循环遍历所有可能组合的最佳方法?

 罂粟花很美也需要阳光 发布于 2023-02-10 14:05

我有两个简单的表:

OrderStatusOrderStage具有单一主键整数的列OrderStatusIDOrderStageID分别.每个表返回大约5行.

我要做的是创建一个SELECT语句,它计算每个OrderStatusID和OrderStageID组合的订单数.这是一个例子:

SELECT 
 COUNT(OrderID)
FROM
 Order
WHERE
 OrderStatusID = '1' and OrderStageID = '1'


SELECT 
 COUNT(OrderID)
FROM
 Order
WHERE
 OrderStatusID = '1' and OrderStageID = '2'

......
SELECT 
 COUNT(OrderID)
FROM
 Order
WHERE
 OrderStatusID = '4' and OrderStageID = '5'

我必须编写5x5 SQL语句来计算每种可能组合中的订单数量,这对我来说变得乏味.如果有人向表OrderStatusOrderStage表添加更多行,那么我将不得不继续重新访问此代码以添加新组合.

此数据的最终呈现将位于网页上的"树"中,与Outlook在邮件面板中显示收件箱,已发送邮件,已删除等电子邮件的计数方式非常相似.我在我的网页上使用ColdFusion.如果我使用GROUP BY语句来获取数据,那么我如何在ColdFusion中单独显示每个结果行?会工作吗?

对于给定OrderStatusID和OrderStageID组合的Order表中没有行,它应该返回0或NULL.这就是我为每种可能的组合使用单独的SELECT语句的原因.

1 个回答
  • 我确信有更简单的方法可以为SQL Server 2012编写它,但实质上是CROSS JOIN为了获得所有可能的状态和阶段组合(即25行).然后执行外部联接orders以获取每个组合的计数:

    SQL小提琴

    **通常最好避免使用order表名等关键字

      SELECT osg.OrderStageID, ost.OrderStatusID, COUNT(o.OrderID) AS TotalOrders
      FROM   orderStage osg CROSS JOIN orderStatus ost
                 LEFT JOIN [order] o ON o.OrderStageID = osg.OrderStageID
                        AND o.OrderStatusID = ost.OrderStatusID
      GROUP BY osg.OrderStageID, ost.OrderStatusID
    

    注意:请务必查看CROSS JOIN的运作方式.

    2023-02-10 14:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有