当前位置: 代码迷 >> Sql Server >> 笔试碰到SQL题,你会吗
  详细解决方案

笔试碰到SQL题,你会吗

热度:68   发布时间:2016-04-24 10:18:35.0
笔试遇到SQL题,你会吗?


如图,写sql最后的形式是这样的:
     
       stuname             语文             数学              英语
          stone                 80                   60                 90
          张三                   100                80                  60

该怎么写sql,请教?
------解决方案--------------------
他的目的是考你pivot,不过我个人觉得出这题目去考面试实在没必要,毕竟pivot再真实应用场景中的使用次数有限,只要知道有这号东西,没必要让你把sql写出来,比起行列转换,sql里重要的考点比比皆是
------解决方案--------------------
引用:
3个case when

这个的确方便,但别人出这题目,考点肯定不是让写3个case when
------解决方案--------------------

create table #tb([stuname] varchar(10),[subject] varchar(10),[score] int)

insert into #tb 
select  '张三','语文',82   union all
select  '张三','数学',76    union all
select  '张三','英语',67     union all
select  '李四','语文',75     union all
select  '李四','数学',54     union all
select  '李四','英语',73    
 
-------查询
declare @sql varchar(8000)
set @sql=''   
select @sql=@sql+','+[subject] from #tb group by [subject] 
set @sql=stuff(@sql,1,1,'')
set @sql='select * from #tb pivot (max([score]) for [subject] in ('+@sql+')) a'
exec(@sql)
drop table #tb
---------------
--结果

(6 行受影响)
stuname    数学          英语          语文
---------- ----------- ----------- -----------
李四         54          73          75
张三         76          67          82

(2 行受影响)

------解决方案--------------------
引用:
Quote: 引用:

3个case when

这个的确方便,但别人出这题目,考点肯定不是让写3个case when
别说得太“肯定”,思路比实现更重要
------解决方案--------------------
引用:
别说得太“肯定”,思路比实现更重要

被抓语病了,应该写“可能性较大”
------解决方案--------------------
2009年我面试的一家公司用的是2000,所以如果这是那个公司出的题,肯定不会用pivot

引用:
Quote: 引用:

别说得太“肯定”,思路比实现更重要

被抓语病了,应该写“可能性较大”

------解决方案--------------------
IF OBJECT_ID(N'Test') IS NOT NULL 
DROP TABLE Test
GO

create table Test(id INT IDENTITY(1,1), stuname varchar(10),subject varchar(10),score int)
 
insert into Test 
select  'stone','语文',80     union all
select  'stone','数学',60     union all
select  'stone','英语',90     union all
select  '张三','语文',100      union all
select  '张三','数学',80      union all
select  '张三','英语',60   

 

GO
 
-------------------------------------静态SQl--------------------------------------
SELECT   stuname,MAX(CASE WHEN SUBJECT='语文' THEN score END) AS  '语文'
,MAX(CASE WHEN SUBJECT='数学' THEN score END) AS  '数学'
,MAX(CASE WHEN SUBJECT='英语' THEN score END) AS  '英语'
 FROM Test GROUP BY stuname
 
-------------------------------------动态SQl--------------------------------------

DECLARE @Sql VARCHAR(8000)
SELECT  @Sql='SELECT   stuname'
SELECT @Sql=@Sql+',MAX(CASE SUBJECT WHEN '''+SUBJECT+''' THEN score END)'+''+SUBJECT+''
FROM (SELECT DISTINCT SUBJECT FROM dbo.Test)a
SELECT @Sql=@Sql+' FROM Test GROUP BY stuname'
  相关解决方案