if object_id('tempdb..#A') is not null drop table #A select 'a' as Name,2007 as Year,100 as M into #A insert into #A select 'a'as Name,2008 as Year,400 as M insert into #A select 'a'as Name,2009 as Year,600 as M insert into #A select 'a'as Name,2010 as Year,800 as M insert into #A select 'b'as Name,2007 as Year,150 as M insert into #A select 'b'as Name,2008 as Year,250 as M insert into #A select 'b'as Name,2009 as Year,450 as M insert into #A select 'b'as Name,2010 as Year,650 as M insert into #A select 'c'as Name,2007 as Year,700 as M insert into #A select 'c'as Name,2008 as Year,800 as M insert into #A select 'c'as Name,2009 as Year,850 as M insert into #A select 'c'as Name,2010 as Year,950 as M select * from #A SELECT NAME,YEAR,(SELECT SUM(M)AS M FROM #A WHERE NAME=T.NAME)AS NUM FROM #A T ORDER BY NAME ,YEAR SELECT NAME,YEAR, SUM(M)AS M FROM #A T GROUP BY NAME,YEARNAME YEAR NUM ---- ----------- ----------- a 2007 1900 a 2008 1900 a 2009 1900 a 2010 1900 b 2007 1500 b 2008 1500 b 2009 1500 b 2010 1500 c 2007 4250 c 2008 4250 c 2009 4250 c 2010 4250 c 2010 4250(所影响的行数为 13 行)NAME YEAR M ---- ----------- ----------- a 2007 100 b 2007 150 c 2007 700 a 2008 400 b 2008 250 c 2008 800 a 2009 600 b 2009 450 c 2009 850 a 2010 800 b 2010 650 c 2010 1900(所影响的行数为 12 行)
我想要的是得到下面这样的结果: Name Year M SubTotal a 2007 100 100 a 2008 400 500 a 2009 600 1100 a 2010 800 1900 b 2007 150 150 b 2008 250 400 b 2009 450 850 b 2010 650 1500 c 2007 700 700 c 2008 800 1500 c 2009 850 2350 c 2010 950 3300谢谢!
我使用下面的这个SUM OVER (PARTITION BY [])可以运行得到下面的结果,但不是我想要的: Name Year M SubTotal a 2007 100 1900 a 2008 400 1900 a 2009 600 1900 a 2010 800 1900 b 2007 150 1500 b 2008 250 1500 b 2009 450 1500 b 2010 650 1500 c 2007 700 3300 c 2008 800 3300 c 2009 850 3300 c 2010 950 3300
select Name,Year,M, sum(M) over (partition by name)as SubTotal from #A order by Name,Year
使用order by分组来做,希望可以
使用order by 就报错: select Name,Year,M, sum(M) over (order by name)as SubTotal from #A order by Name,YearMsg 102, Level 15, State 1, Line 18 Incorrect syntax near 'order'.
if object_id('tempdb..#A') is not null drop table #A select 'a' as Name,2007 as Year,100 as M into #A insert into #A select 'a'as Name,2008 as Year,400 as M insert into #A select 'a'as Name,2009 as Year,600 as M insert into #A select 'a'as Name,2010 as Year,800 as M insert into #A select 'b'as Name,2007 as Year,150 as M insert into #A select 'b'as Name,2008 as Year,250 as M insert into #A select 'b'as Name,2009 as Year,450 as M insert into #A select 'b'as Name,2010 as Year,650 as M insert into #A select 'c'as Name,2007 as Year,700 as M insert into #A select 'c'as Name,2008 as Year,800 as M insert into #A select 'c'as Name,2009 as Year,850 as M insert into #A select 'c'as Name,2010 as Year,950 as M select * from #A SELECT NAME,YEAR,M,( SELECT SUM(M)AS M FROM #A WHERE NAME=T.NAME AND Year<=T.Year)AS NUM FROM #A T ORDER BY NAME ,YEARNAME YEAR M NUM ---- ----------- ----------- ----------- a 2007 100 100 a 2008 400 500 a 2009 600 1100 a 2010 800 1900 b 2007 150 150 b 2008 250 400 b 2009 450 850 b 2010 650 1500 c 2007 700 700 c 2008 800 1500 c 2009 850 2350 c 2010 950 4250 c 2010 950 4250(所影响的行数为 13 行)
if object_id('tempdb..#A') is not null drop table #A select 'a' as Name,2007 as Year,100 as M into #A insert into #A select 'a'as Name,2008 as Year,400 as M insert into #A select 'a'as Name,2009 as Year,600 as M insert into #A select 'a'as Name,2010 as Year,800 as M insert into #A select 'b'as Name,2007 as Year,150 as M insert into #A select 'b'as Name,2008 as Year,250 as M insert into #A select 'b'as Name,2009 as Year,450 as M insert into #A select 'b'as Name,2010 as Year,650 as M insert into #A select 'c'as Name,2007 as Year,700 as M insert into #A select 'c'as Name,2008 as Year,800 as M insert into #A select 'c'as Name,2009 as Year,850 as M insert into #A select 'c'as Name,2010 as Year,950 as M select * from #A SELECT NAME,YEAR,M,( SELECT SUM(M)AS M FROM #A WHERE NAME=T.NAME AND Year<=T.Year)AS NUM FROM #A T ORDER BY NAME ,YEARNAME YEAR M NUM ---- ----------- ----------- ----------- a 2007 100 100 a 2008 400 500 a 2009 600 1100 a 2010 800 1900 b 2007 150 150 b 2008 250 400 b 2009 450 850 b 2010 650 1500 c 2007 700 700 c 2008 800 1500 c 2009 850 2350 c 2010 950 3300(所影响的行数为 12 行)晕,上面的复制出错
谢谢!是我想要的结果。 请问为什么这样的语句都会报错呢: sum([]) over (partition by [] order by []) sum([]) over (order by []) 我在baidu上搜索到很多这样的语句应用,为什么我这里用就不行呢? 我用2005和2008都试过,都不行。 请高手指点。
count、sum、min、max 这样的聚合函数不能用于 over (order by ) 子句,只能用于 over (partition by) 子句。可以参看联机丛书。
select Name,Year,M, sum(M) over (partition by name)as SubTotal from #A Name Year M SubTotal ---- ----------- ----------- ----------- a 2008 400 1900 a 2009 600 1900 a 2010 800 1900 a 2007 100 1900 b 2007 150 1500 b 2008 250 1500 b 2009 450 1500 b 2010 650 1500 c 2007 700 3300 c 2008 800 3300 c 2009 850 3300 c 2010 950 3300(12 行受影响)
如果 SELECT 子句 <select list> 中包含聚合函数,则 GROUP BY 将计算每组的汇总值。指定 GROUP BY 时,选择列表中任意非聚合表达式内的所有列都应包含在 GROUP BY 列表中,或者 GROUP BY 表达式必须与选择列表表达式完全匹配。
select 'a' as Name,2007 as Year,100 as M
into #A
insert into #A select 'a'as Name,2008 as Year,400 as M
insert into #A select 'a'as Name,2009 as Year,600 as M
insert into #A select 'a'as Name,2010 as Year,800 as M
insert into #A select 'b'as Name,2007 as Year,150 as M
insert into #A select 'b'as Name,2008 as Year,250 as M
insert into #A select 'b'as Name,2009 as Year,450 as M
insert into #A select 'b'as Name,2010 as Year,650 as M
insert into #A select 'c'as Name,2007 as Year,700 as M
insert into #A select 'c'as Name,2008 as Year,800 as M
insert into #A select 'c'as Name,2009 as Year,850 as M
insert into #A select 'c'as Name,2010 as Year,950 as M
select * from #A
SELECT NAME,YEAR,(SELECT SUM(M)AS M FROM #A WHERE NAME=T.NAME)AS NUM FROM #A T ORDER BY NAME ,YEAR
SELECT NAME,YEAR, SUM(M)AS M FROM #A T GROUP BY NAME,YEARNAME YEAR NUM
---- ----------- -----------
a 2007 1900
a 2008 1900
a 2009 1900
a 2010 1900
b 2007 1500
b 2008 1500
b 2009 1500
b 2010 1500
c 2007 4250
c 2008 4250
c 2009 4250
c 2010 4250
c 2010 4250(所影响的行数为 13 行)NAME YEAR M
---- ----------- -----------
a 2007 100
b 2007 150
c 2007 700
a 2008 400
b 2008 250
c 2008 800
a 2009 600
b 2009 450
c 2009 850
a 2010 800
b 2010 650
c 2010 1900(所影响的行数为 12 行)
Name Year M SubTotal
a 2007 100 100
a 2008 400 500
a 2009 600 1100
a 2010 800 1900
b 2007 150 150
b 2008 250 400
b 2009 450 850
b 2010 650 1500
c 2007 700 700
c 2008 800 1500
c 2009 850 2350
c 2010 950 3300谢谢!
Name Year M SubTotal
a 2007 100 1900
a 2008 400 1900
a 2009 600 1900
a 2010 800 1900
b 2007 150 1500
b 2008 250 1500
b 2009 450 1500
b 2010 650 1500
c 2007 700 3300
c 2008 800 3300
c 2009 850 3300
c 2010 950 3300
sum(M) over (partition by name)as SubTotal
from #A
order by Name,Year
select Name,Year,M,
sum(M) over (order by name)as SubTotal
from #A
order by Name,YearMsg 102, Level 15, State 1, Line 18
Incorrect syntax near 'order'.
select 'a' as Name,2007 as Year,100 as M
into #A
insert into #A select 'a'as Name,2008 as Year,400 as M
insert into #A select 'a'as Name,2009 as Year,600 as M
insert into #A select 'a'as Name,2010 as Year,800 as M
insert into #A select 'b'as Name,2007 as Year,150 as M
insert into #A select 'b'as Name,2008 as Year,250 as M
insert into #A select 'b'as Name,2009 as Year,450 as M
insert into #A select 'b'as Name,2010 as Year,650 as M
insert into #A select 'c'as Name,2007 as Year,700 as M
insert into #A select 'c'as Name,2008 as Year,800 as M
insert into #A select 'c'as Name,2009 as Year,850 as M
insert into #A select 'c'as Name,2010 as Year,950 as M
select * from #A
SELECT NAME,YEAR,M,(
SELECT SUM(M)AS M FROM #A WHERE NAME=T.NAME AND Year<=T.Year)AS NUM
FROM #A T
ORDER BY NAME ,YEARNAME YEAR M NUM
---- ----------- ----------- -----------
a 2007 100 100
a 2008 400 500
a 2009 600 1100
a 2010 800 1900
b 2007 150 150
b 2008 250 400
b 2009 450 850
b 2010 650 1500
c 2007 700 700
c 2008 800 1500
c 2009 850 2350
c 2010 950 4250
c 2010 950 4250(所影响的行数为 13 行)
select 'a' as Name,2007 as Year,100 as M
into #A
insert into #A select 'a'as Name,2008 as Year,400 as M
insert into #A select 'a'as Name,2009 as Year,600 as M
insert into #A select 'a'as Name,2010 as Year,800 as M
insert into #A select 'b'as Name,2007 as Year,150 as M
insert into #A select 'b'as Name,2008 as Year,250 as M
insert into #A select 'b'as Name,2009 as Year,450 as M
insert into #A select 'b'as Name,2010 as Year,650 as M
insert into #A select 'c'as Name,2007 as Year,700 as M
insert into #A select 'c'as Name,2008 as Year,800 as M
insert into #A select 'c'as Name,2009 as Year,850 as M
insert into #A select 'c'as Name,2010 as Year,950 as M
select * from #A
SELECT NAME,YEAR,M,(
SELECT SUM(M)AS M FROM #A WHERE NAME=T.NAME AND Year<=T.Year)AS NUM
FROM #A T
ORDER BY NAME ,YEARNAME YEAR M NUM
---- ----------- ----------- -----------
a 2007 100 100
a 2008 400 500
a 2009 600 1100
a 2010 800 1900
b 2007 150 150
b 2008 250 400
b 2009 450 850
b 2010 650 1500
c 2007 700 700
c 2008 800 1500
c 2009 850 2350
c 2010 950 3300(所影响的行数为 12 行)晕,上面的复制出错
请问为什么这样的语句都会报错呢:
sum([]) over (partition by [] order by [])
sum([]) over (order by [])
我在baidu上搜索到很多这样的语句应用,为什么我这里用就不行呢?
我用2005和2008都试过,都不行。
请高手指点。
sum(M) over (partition by name)as SubTotal
from #A Name Year M SubTotal
---- ----------- ----------- -----------
a 2008 400 1900
a 2009 600 1900
a 2010 800 1900
a 2007 100 1900
b 2007 150 1500
b 2008 250 1500
b 2009 450 1500
b 2010 650 1500
c 2007 700 3300
c 2008 800 3300
c 2009 850 3300
c 2010 950 3300(12 行受影响)