首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

一路SQL查询面试题,求解

2012-12-15 
一道SQL查询面试题,求解前不久参加了一个面试,因为笔试SQL不过关导致刷了下来。遇到这样一个问题,感觉很简

一道SQL查询面试题,求解
前不久参加了一个面试,因为笔试SQL不过关导致刷了下来。遇到这样一个问题,感觉很简单但是没想到方法,大家帮忙看看,应该是与group by有关。

rq             shengfu
2005-05-09      胜
2005-05-09      胜
2005-05-09      负
2005-05-09      负
2005-05-10      胜
2005-05-10      负
2005-05-10      负
如果要生成下列结果, 该如何写sql语句?
rq              胜      负
2005-05-09      2       2
2005-05-10      1       2



[最优解释]

select rq,sum(case when shengfu='胜' then 1 else 0 end ) '胜',sum(case when shengfu='负' then 1 else 0 end )'负'
from tb
group by rq

[其他解释]
引用:
SQL code

select rq,sum(case when shengfu='胜' then 1 else 0 end ) '胜',sum(case when shengfu='负' then 1 else 0 end )'负'
from tb
group by rq


这样写是对的吗
[其他解释]
--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO 
CREATE TABLE [tb]([rq] DATETIME,[shengfu] VARCHAR(2))
INSERT [tb]
SELECT '2005-05-09','胜' UNION ALL
SELECT '2005-05-09','胜' UNION ALL
SELECT '2005-05-09','负' UNION ALL
SELECT '2005-05-09','负' UNION ALL
SELECT '2005-05-10','胜' UNION ALL
SELECT '2005-05-10','负' UNION ALL
SELECT '2005-05-10','负'
--------------开始查询--------------------------

SELECT * FROM [tb] PIVOT(COUNT([shengfu]) FOR [shengfu] IN([胜],[负]) ) pvt
----------------结果----------------------------
/* 
rq胜负
2005-05-09 00:00:00.00022
2005-05-10 00:00:00.00012
*/

[其他解释]
晕,还没结贴,这样写不对吗?你试过了吗?
引用:
引用:
SQL code

select rq,sum(case when shengfu='胜' then 1 else 0 end ) '胜',sum(case when shengfu='负' then 1 else 0 end )'负'
from tb
group by rq


这样写是对的吗

造数脚本借用阿汤哥的。
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
 GO 
 CREATE TABLE [tb]([rq] DATETIME,[shengfu] VARCHAR(2))
 INSERT [tb]
 SELECT '2005-05-09','胜' UNION ALL
 SELECT '2005-05-09','胜' UNION ALL
 SELECT '2005-05-09','负' UNION ALL
 SELECT '2005-05-09','负' UNION ALL
 SELECT '2005-05-10','胜' UNION ALL
 SELECT '2005-05-10','负' UNION ALL
 SELECT '2005-05-10','负'
 


 select rq,sum(case when shengfu='胜' then 1 else 0 end ) '胜',sum(case when shengfu='负' then 1 else 0 end )'负'
 from tb
 group by rq
 /*
 rq                      胜           负
 ----------------------- ----------- -----------
 2005-05-09 00:00:00.000 2           2
 2005-05-10 00:00:00.000 1           2
 
 (2 行受影响)
 
 */


[其他解释]
declare @t table
(
rq date, shengfu varchar(4)
)

insert into @t values
('2005-05-09','胜'),
('2005-05-09','胜'),
('2005-05-09','负'),
('2005-05-09','负'),
('2005-05-10','胜'),  
('2005-05-10','负'),  
('2005-05-10','负')

select * from @t
pivot 
(
count([shengfu]) for  shengfu in (胜,负)
)
as pvt
 
[其他解释]

select rq,
count(case when shengfu='胜' then shengfu  end) as '胜',
count(case when shengfu='负' then shengfu end) as '负'
from #test group by rq

[其他解释]

select convert(varchar(20),rq,23) as rq,sum(case when shengfu='胜' then 1 else 0 end) as 胜,
sum(case when shengfu='负' then 1 else 0 end)as 负 from tb group by rq order by rq 

[其他解释]
面试的时候要写的帅帅的
[其他解释]
面试的DBA吗? 出这样的题
[其他解释]
要死了。。。这个题目是我出的。。。
你是谁啊
[其他解释]
引用:
要死了。。。这个题目是我出的。。。
你是谁啊

此话当真?
[其他解释]
引用:
引用:

要死了。。。这个题目是我出的。。。
你是谁啊

此话当真?


还真是的,估计刚来我们公司面试过
真是奇怪!我好久没来csdn了,这次莫名其妙过来看,莫名其妙点了这个帖子。。。
[其他解释]
引用:
面试的时候要写的帅帅的
  此话有理
[其他解释]
要死了,我也出了这个题目啊!
[其他解释]
元芳对此没意见
[其他解释]
引用:
晕,还没结贴,这样写不对吗?你试过了吗?

引用:

引用:
SQL code

select rq,sum(case when shengfu='胜' then 1 else 0 end ) '胜',sum(case when shengfu='负' then 1 else 0 end )'负'


from tb
group by rq


……



强大!
[其他解释]
引用:
引用:

引用:

要死了。。。这个题目是我出的。。。
你是谁啊

此话当真?


还真是的,估计刚来我们公司面试过
真是奇怪!我好久没来csdn了,这次莫名其妙过来看,莫名其妙点了这个帖子。。。

狭路相逢了..
[其他解释]
该回复于2012-10-27 11:14:52被版主删除
[其他解释]
引用:
引用:

要死了。。。这个题目是我出的。。。
你是谁啊

此话当真?


别忽悠了,你公司是哪个地方了?我觉得出面试的人脑残,只看考卷,不看作品,代码的质量水准与考试题我觉得关系不是怎么大。
[其他解释]
引用:
面试的DBA吗? 出这样的题


面试的.NET软件工程师,现在的基本考题都是数据库,
[其他解释]
哥们,别说这事了,没事结贴....

热点排行
Bad Request.