将从 CTE 中提取的列排序到变量中

问题描述 投票:0回答:2

我有以下代码作为存储过程的一部分。这部分代码旨在返回稍后在动态 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 变量中得到的内容 - 组件名称仍然没有按权重顺序排序。

我错过了什么?

sql sql-server
2个回答
0
投票

感谢 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

-1
投票

我希望这有帮助。在这种情况下你可以使用 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
© www.soinside.com 2019 - 2024. All rights reserved.