日期:2014-05-18 浏览次数:20577 次
SELECT dbo.Categories.CategoryName, dbo.Products.ProductName, SUM(CONVERT(money, (dbo.[Order Details].UnitPrice * dbo.[Order Details].Quantity) * (1 - dbo.[Order Details].Discount) / 100) * 100) AS ProductSales FROM dbo.Categories INNER JOIN dbo.Products ON dbo.Categories.CategoryID = dbo.Products.CategoryID INNER JOIN dbo.Orders INNER JOIN dbo.[Order Details] ON dbo.Orders.OrderID = dbo.[Order Details].OrderID ON dbo.Products.ProductID = dbo.[Order Details].ProductID WHERE (dbo.Orders.ShippedDate BETWEEN '19970101' AND '19971231') GROUP BY dbo.Categories.CategoryName, dbo.Products.ProductName
SELECT dbo.Categories.CategoryName, dbo.Products.ProductName, SUM( --10 CONVERT( MONEY, (dbo.[Order Details].UnitPrice*dbo.[Order Details].Quantity) *(1- dbo.[Order Details].Discount)/100 )*100 ) AS ProductSales FROM dbo.Categories --1 INNER JOIN dbo.Products --3 ON dbo.Categories.CategoryID = dbo.Products.CategoryID --2 INNER JOIN dbo.Orders --7 INNER JOIN dbo.[Order Details] --5 ON dbo.Orders.OrderID = dbo.[Order Details].OrderID --6 ON dbo.Products.ProductID = dbo.[Order Details].ProductID --4 WHERE (dbo.Orders.ShippedDate BETWEEN '19970101' AND '19971231') --8 GROUP BY dbo.Categories.CategoryName, dbo.Products.ProductName --9
------解决方案--------------------
SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据; 2、where子句基于指定的条件对记录行进行筛选; 3、group by子句将数据划分为多个分组; 4、使用聚集函数进行计算; 5、使用having子句筛选分组; 6、计算所有的表达式; 7、使用order by对结果集进行排序。 另外:一个查询语句各个部分的执行顺序: --8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list> --(1) FROM <left_table> --(3) <join_type> JOIN <right_table> --(2) ON <join_condition> --(4) WHERE <where_condition> --(5) GROUP BY <group_by_list> --(6) WITH {CUBE | ROLLUP} --(7) HAVING <having_condition> --(10) ORDER BY <order_by_list>