Create table test (name char(10),km char(10),cj int)
go
insert test values('张三','语文',80)
insert test values('张三','数学',86)
insert test values('张三','英语',75)
insert test values('李四','语文',78)
insert test values('李四','数学',85)
insert test values('李四','英语',78)

declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',sum(case km when '''+km+''' then cj end) ['+km+']'
from (select distinct km from test) as a
select @sql = @sql+' from test group by name'
print(@sql)
exec(@sql)

drop table test


------------------------------

select name,
sum(case km when '数学' then cj end) [数学],
sum(case km when '英语' then cj end) [英语],
sum(case km when '语文' then cj end) [语文]

from test group by name

结果是执行的中间?
SQL语句在有WHERE语句存在的时候才从最右边开始执行?

-----------------------------------------------------------

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      
WHERE TABLE_NAME = 'author_sales')
   
DROP TABLE author_sales
GO
IF EXISTS(SELECT name FROM sysobjects 
      
WHERE name = 'get_author_sales' AND type = 'P')
   
DROP PROCEDURE get_author_sales
GO
USE pubs
CREATE TABLE author_sales
( data_source   
varchar(20),
  au_id         
varchar(11),
  au_lname      
varchar(40),
  sales_dollars 
smallmoney
)
GO
CREATE PROCEDURE get_author_sales 
AS 
   
SELECT 'PROCEDURE', authors.au_id, authors.au_lname, 
      
SUM(titles.price * sales.qty) 
   
FROM authors INNER JOIN titleauthor 
      
ON authors.au_id = titleauthor.au_id INNER JOIN titles
      
ON titleauthor.title_id = titles.title_id INNER JOIN sales
      
ON titles.title_id = sales.title_id
   
WHERE authors.au_id like '8%'
   
GROUP BY authors.au_id, authors.au_lname
GO
--INSERTSELECT example
USE pubs
INSERT author_sales
   
SELECT 'SELECT', authors.au_id, authors.au_lname, 
      
SUM(titles.price * sales.qty) 
   
FROM authors INNER JOIN titleauthor 
      
ON authors.au_id = titleauthor.au_id INNER JOIN titles
      
ON titleauthor.title_id = titles.title_id INNER JOIN sales
      
ON titles.title_id = sales.title_id
   
WHERE authors.au_id LIKE '8%'
   
GROUP BY authors.au_id, authors.au_lname

--INSERTEXECUTE procedure example
INSERT author_sales EXECUTE get_author_sales

--INSERTEXECUTE('string') example
INSERT author_sales 
EXECUTE 
(
'
SELECT 
''EXEC STRING'', authors.au_id, authors.au_lname, 
   SUM(titles.price * sales.qty) 
   FROM authors INNER JOIN titleauthor 
      ON authors.au_id = titleauthor.au_id INNER JOIN titles
      ON titleauthor.title_id = titles.title_id INNER JOIN sales
      ON titles.title_id = sales.title_id
   WHERE authors.au_id like 
''8%''
   GROUP BY authors.au_id, authors.au_lname
')

--Show results.
SELECT * FROM author_sales