【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

[MSSQL]一道合并成绩最高科目的解决方法

原创 2012年03月28日 08:22:13

昨天在群里一位网友抛出这样的问题:

name   语文    数学     英语
张三    75    90       85
李四    80     85       85
获得表,查询每个 name 成绩最高的学科, 若有相同,并列
name    成绩    科目
张三    90      数学
李四    85      数学,英语

我的方案:

CREATE TABLE [dbo].[ChengJi2](
	[姓名] [nchar](10) NULL,
	[成绩] [int] NULL,
	[科目] nchar(100) NULL,

) ON [PRIMARY]
-------------------------------------
Create Function [dbo].[Getkemu](
	@姓名 char(10)=null)
returns  varchar(8000)
as
begin
      declare   @r   varchar(8000) 
      set   @r= ' ' 
      select  @r=@r+ ', '+ rtrim(CAST (科目 as varchar))   from ChengJi2 where 姓名=@姓名
      return   stuff(@r,1,2, ' ')
end
------------------------------------

Insert into ChengJi2(姓名,成绩,科目) SELECT B.*  FROM (
		select 姓名,MAX (成绩) 成绩  from(
		SELECT     姓名, 语文 as 成绩,'语文' 科目
		FROM         ChengJi 
		union all
		SELECT     姓名, 数学 as 成绩,'数学' 科目
		FROM         ChengJi 
		union all
		SELECT     姓名, 英语 as 成绩,'英语' 科目
		FROM         ChengJi ) T
		group by 姓名) A INNER JOIN 

        (
		select 姓名,MAX (成绩) 成绩,科目  from(
		SELECT     姓名, 语文 as 成绩,'语文' 科目
		FROM         ChengJi 
		union all
		SELECT     姓名, 数学 as 成绩,'数学' 科目
		FROM         ChengJi 
		union all
		SELECT     姓名, 英语 as 成绩,'英语' 科目
		FROM         ChengJi ) T
		group by 姓名,科目) B ON A.姓名=B.姓名 and A.成绩=B.成绩
-------------------------------------------------------------
select 姓名,成绩,dbo.Getkemu(姓名) as 科目 from ChengJi2 
group by 姓名, 成绩

网友一的方案:

select * into #tb
from(
select '张三' as name,60 as 语文,70 as 数学,80 as 英语
union
select '李四' as name,90 as 语文,70 as 数学,90 as 英语
union
select '王武' as name,80 as 语文,80 as 数学,80 as 英语
) a
----------------
select name,max(成绩) as 成绩,
 (select case when 语文=MAX(成绩) then '语文,' else '' end+
         case when 数学=MAX(成绩) then '数学,' else '' end+
         case when 英语=MAX(成绩) then '英语' else '' end
 from #tb ab where ab.name=a.name) as 科目
from
(
select name,语文 as 成绩,'语文' 科目
from #tb
union all
select name,数学 as 成绩,'数学' 科目
from #tb
union all
select name,英语 as 成绩,'英语' 科目
from #tb
) a group by a.name
--------------------
drop table #tb

网友二的方案:

create table #tmp
(
id int primary key,
[name] varchar(255),
语文 int,
数学 int,
英语 int
)
;
insert into #tmp values(1, '张三', 75, 90, 85);
insert into #tmp values(2, '李四', 80, 85, 85);

with
tree as
(
select [name], 分数, 科目  from #tmp
unpivot
(
分数 for 科目 in (语文, 数学, 英语)
)
as unpvt
),
maxTree as
(
select * from tree t1 where 分数 >= (select max(分数) from tree t2 where t1.name = t2.name)
)
select name, 分数, 科目 = stuff((select ',' + 科目 from maxTree t1 where t1.name = t2.name for xml path('')), 1, 1, '')
from maxTree t2
group by name, 分数
drop table #tmp

总结:

如果单纯作为面试的解决方案,我的方法可行。

如果用函数可能面临不同数据库的语法的限制。用函数会导致效率比较低下。

网友一给出了比较通用效率高的方案,一开始我也是这个思路,但case when 掌握的不熟练。

网友二是我的方案的改进版




版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

通过 OLE DB 连接 MSSQL Server时出现乱码的解决方法

当使用OLE DB方式与MS SQL Server连接时,如果数据库的代码页与本地的不同,当进行查询时字符的返回值就会变成 ? 或是乱码, 微软的网站上说这是一个BUG, 并且描述如下:When yo...

[MSSQL]一道合并成绩最高科目的解决方法

昨天在群里一位网友抛出这样的问题: name 语文 数学 英语 张三 75 90 85 李四 80 85 85 获得表,查询每个 name 成绩最高的学科, 若有相同,并列 name 成绩 科目 张三 90 数学 李四 85 数学,英语 我的方案: CREATE TABLE [dbo].[ChengJi2]( [姓名] [nchar](10) NULL, [成绩] [int] NULL, [
  • wsql
  • wsql
  • 2012-03-28 08:22
  • 377

php+mssql输出月份错误(或者说读取datetime月份为中文)解决方法

朋友问我php+mssql输出日期时月份显示是中文,而且不显示秒。   我找了下资料,找到三种解决方法。比如数据库中是:2012 03 28 14:07:17 直接输出来就是: 2012 三月 28...

MSSQL导致java.net.BindException异常的解决方法

昨天同事写了一个程序,使用jdbc频繁访问数据库,导致MSSQL导致java.net.BindException: Address already in use: connect,这是由于connection.close的时候,底层的<span style="font-family

MSSQL2005 孤立用户的解决方法

 Vinehoo.com近日经常遭到攻击,好几次数据库挂马,前几天把论坛升级了,今天又升级了数据库,把之前的MSSQL 2000 升级到MSSQL 2005,用的是数据库还原功能还原的,遇到了这个帐号孤立的问题。 什么是孤立用户的问题? 比如,以前的数据库的很多表是用户test建立的,但是当我们恢复数据库后,test用户此时就成了孤立用户,没有与之对应的登陆用户名,哪怕你建立了一个test登录用户名,而且是以前的用户密码,用该用户登录后同样没办法操作以前属于test的用户表。 Google 了一下,有很多解
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)