黑马程序员技术交流社区

标题: 【已解决】SQl关于sum函数和count函数还有分组的问题 [打印本页]

作者: 李玮    时间: 2012-5-28 09:33
标题: 【已解决】SQl关于sum函数和count函数还有分组的问题
本帖最后由 李玮 于 2012-5-31 17:48 编辑

最近看杨老师视频,比较迷糊,零基础伤不起啊,{:soso_e127:}

这个分组数数的代码(下面的),sum里面的代码不是让‘胜’和‘负’变成0或1分两列,一列胜为1,一列负为1,    我以为sum()里面可以加什么啊,怎么好理解些

还有这个代码 可以用 count函数实现吗?{:soso_e104:}求大神指导
select tname,
sum(
case tscore
when N'胜' then 1
else 0
end
)as 胜,
sum(
case tscore
when N'负' then 1
else 0
end
)as 负
from t_score
group by tname

{:soso_e100:}
下面是这张表的代码



create table T_score (
Tdate datetime null,
Tname nvarchar(50) null,
Tscore nvarchar(50) null,
)
insert T_score(Tdate,Tname,Tscore)values(2008-8-8,N'拜仁',N'胜')
insert T_score(Tdate,Tname,Tscore)values(2008-8-9,N'奇才',N'胜')
insert T_score(Tdate,Tname,Tscore)values(2008-8-9,N'湖人',N'胜')
insert T_score(Tdate,Tname,Tscore)values(2008-8-10,N'拜仁',N'负')
insert T_score(Tdate,Tname,Tscore)values(2008-8-8,N'拜仁',N'负')
insert T_score(Tdate,Tname,Tscore)values(2008-8-12,N'奇才',N'胜')












作者: 喻健    时间: 2012-5-28 10:00
case tscore
when N'胜' then 1
else 0
end
这个语句是把胜负先分为1 和0 ,然后外面用sum将其求和,最后的group by是按照队名来综合。
作者: 朱亮辉    时间: 2012-5-28 12:03
SUM()是数据库的求和函数,COUNT()是数据的计算数据行数的函数。
----------------------创建班级表------------------------------
CREATE TABLE [dbo].[Classs](
        [ID] [int] IDENTITY(1,1) primary key NOT NULL,--主键ID
        [ClassName] [varchar](50) NOT NULL,--班级名称(班级名称是不可以重复的噢)
        [ClassPersonNum] [int] NOT NULL--班级人数
)

--------------------------插入测试数据----------------------------------
INSERT [dbo].[Class] ([ClassName], [ClassPersonNum]) VALUES (N'A1班', 50)
INSERT [dbo].[Class] ([ClassName], [ClassPersonNum]) VALUES (N'A2班', 30)
INSERT [dbo].[Class] ([ClassName], [ClassPersonNum]) VALUES (N'B1班', 40)
INSERT [dbo].[Class] ([ClassName], [ClassPersonNum]) VALUES (N'B2班', 55)

-----------------------------使用COUNT与SUM函数------------------------------------

SELECT count(ClassName) as 班级数 FROM Class   --计算班级数,因为count是计算数据库表行数的,只要有指定的表就可以查询出函数运算的结果,COUNT(1)也可以计算出相同的结果

SELECT SUM(ClassPersonNum) as 总人数 FROM Class  --计算班级总人数,SUM函数要针对指定的并且为Int类型的字段进行加法运算的,将字段中的数值每个都相加起来,如果不指定字段SUM(*)就会出错,字段不是Int类型的也会报错


比较例子跟你说一下两个函数的区别,比如说人数字段计算总人数,本应该使用SUM计算结果,你用COUNT计算只是得到这个表的行数,结果相差太远

以上写的很详细的一个例子,希望能让你理解这两个函数的区别
作者: 李玮    时间: 2012-5-29 16:36
朱亮辉 发表于 2012-5-28 12:03
SUM()是数据库的求和函数,COUNT()是数据的计算数据行数的函数。
----------------------创建班级表------- ...

{:soso_e102:} 高手啊 解释的非常清楚  多谢了 例子和说明我都 保存了 再次感谢

作者: 李玮    时间: 2012-5-29 16:39
朱亮辉 发表于 2012-5-28 12:03
SUM()是数据库的求和函数,COUNT()是数据的计算数据行数的函数。
----------------------创建班级表------- ...

还有 你的这段代码种的 identity(1,1)是不是代表 主键自增设置啊
CREATE TABLE [dbo].[Classs](
        [ID] [int] IDENTITY(1,1) primary key NOT NULL,--主键ID
作者: 刘豪    时间: 2012-5-29 17:36
只能这样
SELECT Date AS 比赛时间,Name AS 球队,Score AS 比赛结果 FROM T_Score
SELECT Name,
SUM(
CASE Score
WHEN N'胜' THEN 1
ELSE 0
END
)AS 胜,
SUM(
CASE Score
WHEN N'负' THEN 1
ELSE 0
END
)AS 负
FROM T_Score
GROUP BY Name

count()是用来查看记录数目
作者: 朱亮辉    时间: 2012-5-29 18:45
本帖最后由 朱亮辉 于 2012-5-29 20:01 编辑
李玮 发表于 2012-5-29 16:39
还有 你的这段代码种的 identity(1,1)是不是代表 主键自增设置啊
CREATE TABLE [dbo].[Classs](
         ...

是的 identity(1,1)就是设置当前字段为标识,并且是自增长的,括号的两个1知道是什么意思吗,这个就不用解释了吧?
作者: 李玮    时间: 2012-5-30 10:25
朱亮辉 发表于 2012-5-29 18:45
是的 identity(1,1)就是设置当前字段为标识,并且是自增长的,括号的两个1知道是什么意思吗,这个就不用解 ...

是不是就是设置里面的 标识增量 和标识种子 这个标识种子为1是不是就是1开始啊
作者: 朱亮辉    时间: 2012-5-30 10:47
李玮 发表于 2012-5-30 10:25
是不是就是设置里面的 标识增量 和标识种子 这个标识种子为1是不是就是1开始啊 ...

是的,你理解的是正确的!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2