重要的事情说三遍

窗口函数只能自select和select顺序之后的命令中使用(orderby可以)但是where不可以

SQL练习--某书第七章(窗口函数

SQL练习--某书第七章(窗口函数

SQL练习--某书第七章(窗口函数

SQL练习--某书第七章(窗口函数

SQL练习--某书第七章(窗口函数

SQL练习--某书第七章(窗口函数

SQL练习--某书第七章(窗口函数

SQL练习--某书第七章(窗口函数

SELECT custid,orderid,qty,
      qty - LAG(qty) OVER(PARTITION BY custid
							  ORDER BY orderdate,orderid) AS diffprec,
	  qty - LEAD(qty) OVER(PARTITION BY custid
							  ORDER BY orderdate,orderid) AS diffprec,
  FROM dbo.Orders;
-- 自己做的 
SELECT empid,
         SUM(CASE WHEN YEAR(orderdate) = 2007 THEN 1 ELSE 0 END)AS cnt2007,
         SUM(CASE WHEN YEAR(orderdate) = 2008 THEN 1 ELSE 0 END)AS cnt2008,
         SUM(CASE WHEN YEAR(orderdate) = 2009 THEN 1 ELSE 0 END)AS cnt2009
  FROM dbo.Orders
 GROUP BY empid,
-- 答案做法
SELECT empid,
	   COUNT(CASE WHEN orderyear = 2007 THEN orderyear ELSE 0 END)AS cnt2007,
	   COUNT(CASE WHEN orderyear = 2007 THEN orderyear ELSE 0 END)AS cnt2007,
	   COUNT(CASE WHEN orderyear = 2007 THEN orderyear ELSE 0 END)AS cnt2007,
  FROM (
        SELECT empid,YEAR(orderdate) AS orderyear
          FROM dbo.Orders) AS D
 GROUP BY empid,

-- 注意sum和count,count只计数,只要满足条件不是null就计算1,不算具体的(有点类似exists

SELECT *
  FROM (SELECT empid,orderyear,
          CASE orderyear
            WHEN 2007 THEN cnt2007
            WHEN 2008 THEN cnt2008
            WHEN 2009 THEN cnt2009
		   END AS numorders
	      FROM dbo.EmpYearOrders
          CROSS JOIN (VALUES(2007),(2008),(2009)) AS YEARS(orderyear) AS D
  WHERE numorders <> 0;
       CASE WHEN cnt2007
-- 先外联结 从3行变成3*3行,
-- 之后 select变成想要的表
-- 之后 where过滤

后面的3个题都要看 

 

相关文章: