SQL分组排序

 分组排序在实际应用中常会用到.就拿零售系统中常出现的一个功能,找出每个类别(西裤,牛仔裤,鞋,衬衫...)中畅销的前10个款式.

假设表 SalesSum : Style,Category,SalesQty

 

在SQL SERVER 2000下:

  1. SELECT *
  2. FROM SalesSum AS S
  3. WHERE Style IN(SELECT TOP 10 Style
  4.             FROM SalesSum
  5.             WHERE S.Category=Category
  6.             ORDER BY SalesQty Desc)
  7. Order By Category,SalesQty Desc

方法1:(利用相关子查询找出销售件数TOP 10)

  1. SELECT *
  2. FROM SalesSum As S
  3. WHERE 10>(SELECT COUNT(*)
  4.           FROM SalesSum
  5.           WHERE Category=S.Category AND SalesQty>S.SalesQty)
  6. ORDER BY Category,SalesQty DESC

方法2:(用count嵌套模拟,记数器COUNT返回同类别中销售件数比自己大的汇总记录数,如不存在相同销售数的情况下,可以理解为所在排位.)

 

再介绍2种 SQL 2005下的做法,比较方便

  1. SELECT *
  2. FROM
  3. (
  4.    SELECT rn=ROW_NUMBER() OVER(PARTITION BY Category ORDER BY SalesQty DESC),*
  5.    FROM SalesSum) AS S
  6. WHERE rn<=10
  7. ORDER BY Category,SalesQty Desc

方法3:(利用SQL05的新特性,ROW_NUMBER()用于分组排列)

 

  1. SELECT DISTINCT b.*
  2. FROM SalesSum AS S
  3. CROSS APPLY
  4. (
  5.    SELECT TOP (10) *
  6.    FROM SalesSum
  7.    WHERE Category=S.Category
  8.    ORDER BY SalesQty DESC
  9. ) AS b
  10. ORDER BY Category,SalesQty Desc

方法4:(利用APPLY表运算符)

APPLY涉及下面两个步骤的子集(取决于APPLY的类型):

1.A1:把右表表达式应用到左表输入的行.

2.A2:添加外部行.

APPLY运算符把右表表达式应用到左输入中的每一行.可以认为它类似于联接,只不过它的右表表达式可以引用左输入中的列.就好像在联接中的两个输入之间没有优先级.而使用APPLY时,就像是先计算左输入,然后为左输入中的每一行计算一次右输入.

CROSS APPLY和OUTER APPLY总是包含步骤A1,只有OUTER APPLY包含步骤A2.如果为CROSS APPLY的外部(左)行应用内部(右)表表达式时返回空集,则不返回该行.而OUTER APPLY将返回该行,并且该行的内表表达式的属性为NULL.

你可能感兴趣的:(数据库开发应用)