麻烦高手看下下面这个sql语句,为啥groupby了后,还能接个having 呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了麻烦高手看下下面这个sql语句,为啥groupby了后,还能接个having 呢?相关的知识,希望对你有一定的参考价值。

SELECT A.班级,A.语文 FROM 表 A LEFT JOIN 表 B ON A.班级=B.班级 AND A.语文<B.语文 GROUP BY A.班级,A.语文 HAVING count(B.语文)<=54

如ls所说,having子句是用用来筛选分组后的条件的语句
where中不允许使用聚合函数,有时需要对分组后的结果再进行一些筛选
比如常见的筛选重复记录,以group by分组后,只想得到分组后数量大于1的,也就是有重复的数据,这时就可以用having count(*)>1
你的语句是筛选出B表中语文成绩低于A表,人数在54个以下来自:求助得到的回答
参考技术A HAVING就是专门用于GROUP BY分组后的条件判断,相当于WHERE.
在这句的意思是先根据表A的班级和语文进行分组,然后在每组中找出B.语文<=54的。追问

根据表A的班级和语文进行分组了,怎么个排列法?比如合在一起的b.语文,他会随着a.班级,a.语文,怎么个分组法?

参考技术B group by后面的having 是可有可无的,但是一定要记住,having只能和group by匹配,表示的意思是在这个条件里面进行分组追问

我晕,但是分组后的的数据里没有b.语文啊

SQL数据库里面显示在将 varchar 值 'S' 转换成数据类型 int 时失败。 下面是存储过程 麻烦看下 是否有错

USE [dbHrm41All_ys]
GO
/****** Object: StoredProcedure [dbo].[Tra_Report_pEvalCourse] Script Date: 11/10/2011 11:09:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Tra_Report_pEvalCourse]
@BeginDate [varchar](32),
@EndDate [varchar](32),
@iStyle [varchar](32)
AS
CREATE TABLE #ResultTb
(
InfoID VARCHAR(32),
ClassID VARCHAR(32),
ClassCode VARCHAR(1024),
ClassName VARCHAR(1024),
CourseID VARCHAR(32),
CourseName VARCHAR(1024),
TeacherID VARCHAR(32),
TeacherName VARCHAR(1024),
TraAddress VARCHAR(1024),
OrganName VARCHAR(1024),
BeginDate DATETIME,
EndDate DATETIME,
LastAvgScore DECIMAL(18,4),
FinalImpressionID VARCHAR(32),
FinalImpressionName VARCHAR(1024),
FinalImpressionNumb INT,
)
INSERT INTO #ResultTb(InfoID,ClassID,ClassCode,ClassName,CourseID,CourseName,TeacherID,TeacherName,TraAddress,OrganName,BeginDate,EndDate,LastAvgScore,FinalImpressionID,FinalImpressionName)
SELECT A.InfoID, A.ClassID, A.ClassCode, A.ClassName, A.CourseID,A.CourseName, A.TeacherID, A.TeacherName,
A.TraAddress ,A.OrganName, A.BeginDate, A.EndDate, (CASE A.LastAvgScore WHEN '-9999.0000' THEN '0' ELSE A.LastAvgScore END), B.vID, B.vName
FROM Tra_Eval_tCourseInfo AS A
CROSS JOIN Dic_vFinalImpression AS B
WHERE A.EvalDate BETWEEN @BeginDate AND @EndDate
UPDATE #ResultTb SET FinalImpressionNumb = ISNULL((SELECT COUNT(1)
FROM Tra_Eval_tCourseStudent
WHERE InfoID = #ResultTb.InfoID
AND FinalImpressionID = #ResultTb.FinalImpressionID
),'0')
IF @iStyle = '0'
BEGIN
SELECT InfoID, ClassID, ClassCode, ClassName, CourseID, CourseName, TeacherID, TeacherName, TraAddress,
OrganName, CONVERT(VARCHAR(10),BeginDate,120) AS BeginDate, CONVERT(VARCHAR(10),EndDate,120) AS EndDate,
LastAvgScore, FinalImpressionID, FinalImpressionName, FinalImpressionNumb
FROM #ResultTb ORDER BY InfoID,FinalImpressionID
END
ELSE
BEGIN
SELECT FinalImpressionName,CourseName,FinalImpressionNumb FROM #ResultTb ORDER BY InfoID,FinalImpressionID
END

varchar 值 'S' 转换成数据类型 int 时失败是指你定义数据类型时不对或者忘记了定义数据类型。追问

还有是在哪修改呢 是程序那需要定义数据类型 还是数据库呢?

追答

先检查下数据库是否定义类型,如果没有就只有用程序定义数据类型了。

参考技术A 某个记录的数值串内有字符'S',当然无法转换成数值了,需要找到这条记录把里面不是数值的字符删掉,如果字符串内确实无法避免出现非数值型字符,则需要在程序中进行处理

以上是关于麻烦高手看下下面这个sql语句,为啥groupby了后,还能接个having 呢?的主要内容,如果未能解决你的问题,请参考以下文章

Hive SQL语句执行顺序

麻烦bat命令高手们,帮我看看,下面这段代码到底哪里有问题,为啥运行的时候,总提示echo 处于关闭状态

存储过程EXECUTE IMMEDIATE V_SQL执行很慢或出不来,如果把V_SQL语句拿出来单独执行很快,这是为啥?

SQL SEVER分类汇总后如何让小计和总计放到下面

sql语句 分次(多次)获取不重复记录,请高手赐教!

sql查询语句的各个命令执行的标准顺序是啥?为啥?