我有两个简单的表:
OrderStatus
和OrderStage
具有单一主键整数的列OrderStatusID
和OrderStageID
分别.每个表返回大约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语句来计算每种可能组合中的订单数量,这对我来说变得乏味.如果有人向表OrderStatus
或OrderStage
表添加更多行,那么我将不得不继续重新访问此代码以添加新组合.
此数据的最终呈现将位于网页上的"树"中,与Outlook在邮件面板中显示收件箱,已发送邮件,已删除等电子邮件的计数方式非常相似.我在我的网页上使用ColdFusion.如果我使用GROUP BY语句来获取数据,那么我如何在ColdFusion中单独显示每个结果行?会
工作吗?
对于给定OrderStatusID和OrderStageID组合的Order表中没有行,它应该返回0或NULL.这就是我为每种可能的组合使用单独的SELECT语句的原因.
我确信有更简单的方法可以为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的运作方式.