重要的事情说三遍
窗口函数只能自select和select顺序之后的命令中使用(orderby可以)但是where不可以
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个题都要看