Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server模式SQL_Sql_Tsql - Fatal编程技术网

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