菜鸟求SQL语句

瞪谁谁蛋疼 2015-04-15 07:06:32
表A如下:
ID Name Subject Mark
1 张三 语文 85
2 李四 语文 92
3 王五 语文 88
4 李四 数学 64
5 张三 英语 77
6 王五 英语 81

我想得到如下格式的数据,用一条数据怎么搞?

姓名 语文 数学 英语
李四 92 64 NULL
王五 88 NULL 81
张三 85 NULL 77
...全文
247 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
czfxwpy 2015-05-15
  • 打赏
  • 举报
回复
--静态 SELECT Name ,SUM(CASE WHEN Subject='语文' THEN Mark END)[语文] ,SUM(CASE WHEN Subject='数学' THEN Mark END)[数学] ,SUM(CASE WHEN Subject='英语' THEN Mark END)[英语] FROM A GROUP BY Name 这是很传统的行转列了, SELECT * FROM tb pivot( MAX(分数) FOR 课程 IN (语文,数学,英语))a 这个pivot函数倒是可以应用一下 都好
-小蕾- 2015-05-15
  • 打赏
  • 举报
回复


with tb(姓名,课程,分数)
as(
SELECT'张三','语文',85
UNION ALL SELECT'李四','语文',92
UNION ALL SELECT'王五','语文',88
UNION ALL SELECT'李四','数学',64
UNION ALL SELECT'张三','英语',77
UNION ALL SELECT'王五','英语',81
)

SELECT * FROM tb pivot( MAX(分数) FOR 课程 IN (语文,数学,英语))a
HelloWordGirl 2015-05-15
  • 打赏
  • 举报
回复
DECLARE @SQL VARCHAR(8000)--SQL2005+可以用VARCHAR(MAX)代替 SET @SQL='SELECT Name' SELECT @SQL=@SQL+',SUM(CASE WHEN Subject='''+Subject+''' THEN Mark END)['+Subject+']' FROM A GROUP BY Subject SET @SQL=@SQL+'FROM A GROUP BY Name' PRINT @SQL EXEC(@SQL) --静态 SELECT Name ,SUM(CASE WHEN Subject='语文' THEN Mark END)[语文] ,SUM(CASE WHEN Subject='数学' THEN Mark END)[数学] ,SUM(CASE WHEN Subject='英语' THEN Mark END)[英语] FROM A GROUP BY Name
还在加载中灬 2015-04-22
  • 打赏
  • 举报
回复
引用 6 楼 u012263033 的回复:
写的对新手来说并不能看懂,所以楼主并不能用
这个是行转列,楼主应该是希望比较简便的写法,2005+PIVOT透视应该比较简洁了
利欲熏心 2015-04-22
  • 打赏
  • 举报
回复
引用 1 楼 ky_min 的回复:
--动态(科目的顺序会按拼音顺序)
DECLARE @SQL VARCHAR(8000)--SQL2005+可以用VARCHAR(MAX)代替
SET @SQL='SELECT Name'
SELECT @SQL=@SQL+',SUM(CASE WHEN Subject='''+Subject+''' THEN Mark END)['+Subject+']'
FROM A GROUP BY Subject
SET @SQL=@SQL+'FROM A GROUP BY Name'
PRINT @SQL
EXEC(@SQL)
--静态
SELECT Name
	,SUM(CASE WHEN Subject='语文' THEN Mark END)[语文]
	,SUM(CASE WHEN Subject='数学' THEN Mark END)[数学]
	,SUM(CASE WHEN Subject='英语' THEN Mark END)[英语]
FROM A GROUP BY Name
写的对新手来说并不能看懂,所以楼主并不能用
bitbihz 2015-04-22
  • 打赏
  • 举报
回复
INSERT INTO c SELECT '张三' , '语文',8 union all SELECT '李四' , '语文', 92 union all SELECT '王五','语文', 88 union all SELECT '李四','数学',64 union all SELECT '张三','英语',77 union all SELECT '王五', '英语', 81 SELECT [name],max(case subject WHEN '语文' then mark end )as 语文, max(case subject when '数学'then mark end) as 数学 , max(case subject when '英语' then mark END )as 英语 FROM c group by [name]
还在加载中灬 2015-04-17
  • 打赏
  • 举报
回复
我也觉得上面那静态的写法已经挺简单了 不过作为对比,你看下
--以下是2005+可以用的写法
--动态(科目的顺序会按拼音顺序)
DECLARE @SQL VARCHAR(MAX)
SET @SQL=''
SELECT @SQL=@SQL+',['+Subject+']'
FROM A GROUP BY Subject
SET @SQL='SELECT * FROM (SELECT Name,Subject,Mark FROM A)T PIVOT(MAX(Mark)FOR Subject IN('
	+STUFF(@SQL,1,1,'')+'))P'
--PRINT @SQL
EXEC(@SQL)
--静态
SELECT * FROM
(SELECT Name,Subject,Mark FROM A)T
PIVOT(MAX(Mark)FOR Subject IN([语文],[数学],[英语]))P
卖水果的net 2015-04-17
  • 打赏
  • 举报
回复
1# 给出的那个静态的方法,就是最简单的了。
瞪谁谁蛋疼 2015-04-16
  • 打赏
  • 举报
回复
引用 1 楼 ky_min 的回复:
--动态(科目的顺序会按拼音顺序)
DECLARE @SQL VARCHAR(8000)--SQL2005+可以用VARCHAR(MAX)代替
SET @SQL='SELECT Name'
SELECT @SQL=@SQL+',SUM(CASE WHEN Subject='''+Subject+''' THEN Mark END)['+Subject+']'
FROM A GROUP BY Subject
SET @SQL=@SQL+'FROM A GROUP BY Name'
PRINT @SQL
EXEC(@SQL)
--静态
SELECT Name
	,SUM(CASE WHEN Subject='语文' THEN Mark END)[语文]
	,SUM(CASE WHEN Subject='数学' THEN Mark END)[数学]
	,SUM(CASE WHEN Subject='英语' THEN Mark END)[英语]
FROM A GROUP BY Name
哥,还有其他简单的方法没?
还在加载中灬 2015-04-15
  • 打赏
  • 举报
回复
--动态(科目的顺序会按拼音顺序)
DECLARE @SQL VARCHAR(8000)--SQL2005+可以用VARCHAR(MAX)代替
SET @SQL='SELECT Name'
SELECT @SQL=@SQL+',SUM(CASE WHEN Subject='''+Subject+''' THEN Mark END)['+Subject+']'
FROM A GROUP BY Subject
SET @SQL=@SQL+'FROM A GROUP BY Name'
PRINT @SQL
EXEC(@SQL)
--静态
SELECT Name
	,SUM(CASE WHEN Subject='语文' THEN Mark END)[语文]
	,SUM(CASE WHEN Subject='数学' THEN Mark END)[数学]
	,SUM(CASE WHEN Subject='英语' THEN Mark END)[英语]
FROM A GROUP BY Name

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧