use module
go
create table PopulationInfo
(  id int  identity(1,1) primary key,
   country varchar(10) not null,
   sex     tinyint, -- l表男性 2表女性
   number  int 
      
)insert  into PopulationInfo (country,sex,number) values ('中国',1,340)
insert  into PopulationInfo (country,sex,number) values ('中国',2,260)
insert  into PopulationInfo (country,sex,number) values ('美国',1,45)
insert  into PopulationInfo (country,sex,number) values ('美国',2,55)
insert  into PopulationInfo (country,sex,number) values ('加拿大',1,51)
insert  into PopulationInfo (country,sex,number) values ('加拿大',2,49)
insert  into PopulationInfo (country,sex,number) values ('英国',1,40)
insert  into PopulationInfo (country,sex,number) values ('英国',1,60)use module 
 go select country, sum (case when sex = 1 then number else 0 end ) as male, --男性
 sum (case when sex = 2 then number  else 0 end ) as female-- 女性
 from PopulationInfo
 --group by country 
上面的查询按 country male female 格式显示
这儿查询的时候如果去掉group by country会提示错误“选择列表中的列 'PopulationInfo.country' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中”
这个怎么理解??

解决方案 »

  1.   

    按country 分组显示男女人数,如果不按country分组显示则可以去掉group by country 
    且select 里country 也必须去掉。
      

  2.   

    你select 里面用了两个sum, sum 是聚合函数,你用了聚合函数那么你就得,把除了聚合函数以外的所有的select后面的字段都要group by 在后面,这么说可以吧?也就是说用了聚合函数那么你就必须得使用group by除了聚合函数以外的字段。
      

  3.   

    T-SQL的大概顺序是先FROM 在where 再group by 然后select,而你用了聚合函数:sum等,且按照你的情况,需要使用group,一旦使用了group by ,那么select的列就是group by中出现了的列中的全部或者某些,不能超出这个反问。可以看看2005技术内幕T-SQL查询。
      

  4.   

    因为你使用了聚合函数sum  那么没有使用聚合函数的列或者字段都将放到group by 中进行分组
    要不就除了聚合函数以外的字段都略过不写