SQL Server模式SQL
我有一张表,上面列出了每个班级学生的成绩。 我想要一个如下所示的结果集:SQL Server模式SQL,sql,tsql,Sql,Tsql,我有一张表,上面列出了每个班级学生的成绩。 我想要一个如下所示的结果集: BIO...B CHEM...C 其中B和C是该类的模式。 我可以得到所有等级的模式,但不确定如何获得每个班级的模式你只需要按班级名称分组 使用GROUPBY子句 SELECT className, ClassMode(className) FROM Grades GROUP BY className 当然,必须创建模式函数,但它是一个简单的函数,如: CREATE FUNCTION ClassMode(@ClassN
BIO...B
CHEM...C
其中B和C是该类的模式。
我可以得到所有等级的模式,但不确定如何获得每个班级的模式你只需要按班级名称分组
使用GROUPBY子句
SELECT className, ClassMode(className)
FROM Grades
GROUP BY className
当然,必须创建模式函数,但它是一个简单的函数,如:
CREATE FUNCTION ClassMode(@ClassName varchar(50))
RETURNS varchar(2)
AS
BEGIN
Declare @temp varchar(2)
SELECT @temp = TOP 1 Grade, COUNT(*) Grades as frequency
FROM Grades
WHERE ClassName = @ClassName
GROUP BY ClassName
ORDER BY frequency DESC
RETURN @temp
END
下面是SQL 2005/2008上的类似内容:
;WITH
Counts AS (
SELECT ClassName, Grade, COUNT(*) AS GradeFreq
FROM Scores
GROUP BY ClassName, Grade
)
, Ranked AS (
SELECT ClassName, Grade, GradeFreq
, Ranking = DENSE_RANK() OVER (PARTITION BY ClassName ORDER BY GradeFreq DESC)
FROM Counts
)
SELECT * FROM Ranked WHERE Ranking = 1
或者也许只是:
;WITH Ranked AS (
SELECT
ClassName, Grade
, GradeFreq = COUNT(*)
, Ranking = DENSE_RANK() OVER (PARTITION BY ClassName ORDER BY COUNT(*) DESC)
FROM Scores
GROUP BY ClassName, Grade
)
SELECT * FROM Ranked WHERE Ranking = 1
如果你是在统计意义上说话,那就不是这种模式。模式是最常出现的元素。在这种情况下,您的两个类都是Bio的双模A、C和CHEM的B、D。我使用的结果集与我使用的示例表值不相关。您真的想要该模式吗?或者,您是在寻找示例中显示的两个值难以区分的平均值还是中值?我想要模式,即每个类最常出现的值,我使用的是MS SQL Server,没有内置模式SQL Server有模式函数吗?我是这方面的新手,不知道我可以,是否很容易找到放置自定义函数的位置,这样我调用它的SQL就可以找到它?什么?您无法轻松编写用户定义的聚合。函数代码中缺少某些内容,不是吗?似乎根本没有使用@ClassName。我认为应该将FROM子句更改为FROM等级,其中ClassName=@ClassName,或者将GROUP BY子句更改为ClassName=@ClassName的GROUP BY ClassName。另外,主菜单中的选择可以是简单地从成绩中选择不同的类名ClassModeClassName。这样,每个类名有一个模式。还是我弄错了?谢谢你对函数定义的理解,我肯定错过了where/have。至于不同的,你肯定可以这样做-我的印象是OP会为每个学生做,所以我怀疑简单的查询是否能满足他们的需要,但你对给定的示例是正确的。我需要每个类的模式,所以你是说我需要修改这个UDF使其工作?谢谢,这样就可以了,但我正在研究一个人是如何做一个UDF的
;WITH Ranked AS (
SELECT
ClassName, Grade
, GradeFreq = COUNT(*)
, Ranking = DENSE_RANK() OVER (PARTITION BY ClassName ORDER BY COUNT(*) DESC)
FROM Scores
GROUP BY ClassName, Grade
)
SELECT * FROM Ranked WHERE Ranking = 1