vol*_*one 1 sql sql-server coldfusion sql-server-2012
我有两个简单的表:
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'
Run Code Online (Sandbox Code Playgroud)
我必须编写5x5 SQL语句来计算每种可能组合中的订单数量,这对我来说变得乏味.如果有人向表OrderStatus或OrderStage表添加更多行,那么我将不得不继续重新访问此代码以添加新组合.
此数据的最终呈现将位于网页上的"树"中,与Outlook在邮件面板中显示收件箱,已发送邮件,已删除等电子邮件的计数方式非常相似.我在我的网页上使用ColdFusion.如果我使用GROUP BY语句来获取数据,那么我如何在ColdFusion中单独显示每个结果行?会<cfquery group="">工作吗?
对于给定OrderStatusID和OrderStageID组合的Order表中没有行,它应该返回0或NULL.这就是我为每种可能的组合使用单独的SELECT语句的原因.
我确信有更简单的方法可以为SQL Server 2012编写它,但实质上是CROSS JOIN为了获得所有可能的状态和阶段组合(即25行).然后执行外部联接orders以获取每个组合的计数:
**通常最好避免使用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的运作方式.