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

vol*_*one 1 sql sql-server coldfusion sql-server-2012

我有两个简单的表:

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'
Run Code Online (Sandbox Code Playgroud)

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

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

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

Lei*_*igh 7

我确信有更简单的方法可以为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
Run Code Online (Sandbox Code Playgroud)

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