2016-05-01 236 views
5

我正在使用以下SQL查询返回25行。如何修改它忽略第一行:选择所有行并忽略第一行

SELECT fiscal_year, SUM(total_sales) as sum_of_year, AVG(SUM(total_sales)) 
OVER() as avg_sum 
FROM sales_report 
GROUP BY fiscal_year 
ORDER BY fiscal_year ASC 

我使用SQL Server 2008的

感谢。

+0

我不相信LIMIT和OFFSET在SQL Server 2008中提供您可能需要使用ROW_NUMBER的一些变种()(不包括它等于1) 。 – ZLK

+2

... _你为什么要忽略第一行?为什么不用一个'WHERE'子句排除那个财政年度呢?请注意,在AVG运行之后排除它(与'OFFSET'或使用窗口函数一样)会使平均值“不正确” - 您将添加对用户不可见的数字。 –

回答

3

您可以在SQL Server 2008中

SELECT fiscal_year, SUM(total_sales) as sum_of_year, AVG(SUM(total_sales)) 
OVER() as avg_sum 
FROM sales_report 
GROUP BY fiscal_year 

EXCEPT 

SELECT TOP 1 fiscal_year, SUM(total_sales) as sum_of_year, AVG(SUM(total_sales)) 
OVER() as avg_sum 
FROM sales_report 
GROUP BY fiscal_year 
ORDER BY fiscal_year ASC 

使用EXCEPT对于SQL Server 2012及以上版本,你可以使用FETCH OFFSET

0

假设这正是你要如何查询,然后: SELECT fiscal_year, SUM(total_sales) as sum_of_year, AVG(SUM(total_sales)) OVER() as avg_sum FROM sales_report WHERE fiscal year <> (SELECT MIN(Fiscal_year) FROM sales_report)) GROUP BY fiscal_year ORDER BY fiscal_year ASC

然后你可以删除“排序”。
适用于所有版本的

+0

...这可能是更好的选择,但与其他答案相比,它会改变他的输出,因为运行平均值会改变。另外,不,你(可能)不能删除'ORDER BY' - 如果OP要求它们按照特定的顺序(不管删除'第一个'),他需要这个子句。 –

0

可以使用ROW_NUMBER窗函数

;with cte as 
(
SELECT Row_number()over(order by fiscal_year) as RN,fiscal_year, SUM(total_sales) as sum_of_year, AVG(SUM(total_sales)) 
OVER() as avg_sum 
FROM sales_report 
GROUP BY fiscal_year 
) 
select * 
From cte 
Where RN <> 1 
ORDER BY fiscal_year ASC 
0

希望这是正确的。这是我曾试图弥补它:

SELECT fiscal_year 
    ,a.sum_of_year 
    ,AVG(SUM(a.sum_of_year)) OVER() AS avg_sum 
FROM (
    SELECT Row_number() OVER (
      ORDER BY fiscal_year 
      ) AS RN 
     ,fiscal_year 
     ,SUM(total_sales) AS sum_of_year 
    FROM test_fiscal 
    GROUP BY fiscal_year 
    ) a 
WHERE a.rN > 1 
GROUP BY fiscal_year 
    ,rn 
    ,a.sum_of_year 
ORDER BY fiscal_year ASC