我有以下代码作为存储过程的一部分。这部分代码旨在返回稍后在动态 PIVOT 中使用的列名称。
DECLARE @Components NVARCHAR(MAX)='';
WITH CTECols AS (
SELECT cc.strName, cc.dblWeighting
FROM tblStudentComponentInformation sci INNER JOIN tblCourseComponents cc ON sci.lngExamID = cc.lngExamID
INNER JOIN tblCourses c ON cc.lngCourseID = c.lngCourseID
INNER JOIN tblStudents ON sci.strCID = tblStudents.strCID
INNER JOIN tblProgrammeSubstreams ps ON tblStudents.lngProgrammeSubstreamID = ps.lngProgrammeSubstreamID
INNER JOIN tblDegreeProgrammeCodes dpc ON ps.lngDegreeProgrammeID = dpc.lngDegreeProgrammeID
WHERE c.blnResearchProject<>0 AND dpc.blnMScProgramme<>0
)
SELECT @Components=COALESCE(@Components + ',','')
+ QUOTENAME(strName)
FROM (SELECT DISTINCT strName FROM CTECols) AS Headers
如果我简单地选择我的 CTE 结果,结果如下所示:
SELECT DISTINCT strName, dblWeighting
FROM CTECols
字符串名称 | dbl 加权 |
---|---|
文献综述 | 0.1 |
海报展示 | 0.1 |
研究论文 | 0.6 |
研究项目绩效 | 0.2 |
我想要的是按权重降序排列的列列表,如下所示:
[Research Paper],[Research Project Performance],[Literature Review],[Poster Presentation]
但是我得到的是这样的:
[Literature Review],[Poster Presentation],[Research Paper],[Research Project Performance]
我尝试对 CTE 内的数据进行排序:
WITH CTECols AS (
SELECT TOP 100 PERCENT cc.strName, cc.dblWeighting
FROM tblStudentComponentInformation sci INNER JOIN tblCourseComponents cc ON sci.lngExamID = cc.lngExamID
INNER JOIN tblCourses c ON cc.lngCourseID = c.lngCourseID
INNER JOIN tblStudents ON sci.strCID = tblStudents.strCID
INNER JOIN tblProgrammeSubstreams ps ON tblStudents.lngProgrammeSubstreamID = ps.lngProgrammeSubstreamID
INNER JOIN tblDegreeProgrammeCodes dpc ON ps.lngDegreeProgrammeID = dpc.lngDegreeProgrammeID
WHERE c.blnResearchProject<>0 AND dpc.blnMScProgramme<>0
ORDER BY dblWeighting DESC
)
我还尝试在以下语句中对 CTE 的输出进行排序:
SELECT @Components=COALESCE(@Components + ',','')
+ QUOTENAME(strName)
FROM (SELECT TOP 100 PERCENT strName, MAX(dblWeighting) AS Weighting FROM CTECols GROUP BY strName ORDER BY MAX(dblWeighting) DESC) AS Headers
但是这些方法都没有改变我在 @Components 变量中得到的内容 - 组件名称仍然没有按权重顺序排序。
我错过了什么?
感谢 Thom A 的建议链接,我现在已将代码更改为以下内容,该代码有效:
DECLARE @Components NVARCHAR(MAX)='';
WITH CTECols AS (
SELECT DISTINCT cc.strName, cc.dblWeighting
FROM tblStudentComponentInformation sci INNER JOIN tblCourseComponents cc ON sci.lngExamID = cc.lngExamID
INNER JOIN tblCourses c ON cc.lngCourseID = c.lngCourseID
INNER JOIN tblStudents ON sci.strCID = tblStudents.strCID
INNER JOIN tblProgrammeSubstreams ps ON tblStudents.lngProgrammeSubstreamID = ps.lngProgrammeSubstreamID
INNER JOIN tblDegreeProgrammeCodes dpc ON ps.lngDegreeProgrammeID = dpc.lngDegreeProgrammeID
WHERE c.blnResearchProject<>0 AND dpc.blnMScProgramme<>0
)
SELECT @Components=STRING_AGG(QUOTENAME(strName),',') WITHIN GROUP (ORDER BY dblWeighting DESC)
FROM CTECols
我希望这有帮助。在这种情况下你可以使用 ROW_NUMBER 函数,它非常有用。
SELECT @Components=COALESCE(@Components + ',','')
+ QUOTENAME(strName)
FROM (SELECT TOP 100 PERCENT strName, ROW_NUMBER() OVER (ORDER BY MAX(dblWeighting) DESC) AS Weighting FROM CTECols GROUP BY strName ORDER BY MAX(dblWeighting) DESC) AS Headers
ORDER BY Weighting