我需要为调查应用程序创建报告时需要帮助。涉及5个主要表:
每次创建调查时ReportColumnName
,都会生成一个新的调查,该调查需要成为报告中的一列。对于这些列中的每一个,以及对于每个部分(在调查中处于活动状态的部分),都会有一个SectionScoreValue
。这会进一步链接,并检查它是否在到的间隔内ScoreCategories
,并CategoryName
为每个调查和部分显示结果类别()。
我一直在寻找有关如何正确旋转这些列并正确显示所需值的日子。通过对网站上的一些代码进行改编,我认为这是可行的:
declare @SQL nvarchar(max), @Cols nvarchar(max)
select @Cols =
stuff(
(
select ', ' + quotename(dt)
from
(
select TOP 100 PERCENT Sv.ID, Sv.ReportColumnName as dt
from Surveys AS Sv
ORDER BY Sv.ID
) X
ORDER BY X.ID FOR XML PATH('')
),1,1,''
)
SELECT @Cols
set @SQL =
'SELECT Sv.ReportColumnName, SSSV.*
FROM Surveys AS Sv
INNER JOIN Sections_Surveys__ScoreValues AS SSSV
ON SSSV.FK_Surveys_ID = Sv.ID
INNER JOIN Sections AS Sc
ON Sc.ID = SSSV.FK_Sections_ID
INNER JOIN Sections_Surveys AS SS
ON SS.FK_Surveys_ID = Sv.ID
AND SS.FK_Sections_ID = Sc.ID
INNER JOIN ScoreCategories AS ScoreC
ON ScoreC.ID = SSSV.FK_ScoreCategories_ID
PIVOT (max(SSSV.SectionScoreValue) FOR Sv.ReportColumnName IN (' + @Cols
+')) pvt'
execute (@sql)
该@Cols
变量保存我需要的列(即调查的名称),并正确显示它们(并以逗号分隔)。所以这部分工作正常。
我的问题是下一部分应该(最初)将SectionScoreValue
每个部分SectionName
(放在第一列)和每个调查(每个都放在一个单独的列)放在一起。
这些调查列是在创建新调查列时动态添加的,因此它们永远不是一个常数。
这些表中的每个表都有一CreateDate
列,其默认值为GetDATE()
。我得到的错误是:
为“ pvt”多次指定了“ CreateDate”列。
无法绑定多部分标识符“ Sv.ReportColumnName”。
列前缀“ SSSV”与查询中使用的表名或别名不匹配。
请帮助正确显示我的数据。它应该显示类似以下内容:
Section Survey1 Survey2 Survey3 ......
s1 1.33 1.66 2.5
s2 0.00 3.33 4
s3 2.33 2 1.66
s4 0.66 2.5 3
这些数字也可以替换为ScoreCategoryName中的值(根据数字所在的时间间隔,例如“好”,“优秀”等)。
谢谢
编辑1:这是PRINT @SQL
产生:
SELECT Sv.ReportColumnName, SSSV.*
FROM Surveys AS Sv
INNER JOIN Sections_Surveys__ScoreValues AS SSSV
ON SSSV.FK_Surveys_ID = Sv.ID
INNER JOIN Sections AS Sc
ON Sc.ID = SSSV.FK_Sections_ID
INNER JOIN Sections_Surveys AS SS
ON SS.FK_Surveys_ID = Sv.ID
AND SS.FK_Sections_ID = Sc.ID
INNER JOIN ScoreCategories AS ScoreC
ON ScoreC.ID = SSSV.FK_ScoreCategories_ID
PIVOT (max(SSSV.SectionScoreValue) FOR Sv.ReportColumnName
IN ( [S1-1-2 -3], [S217], [al 3], [S37], [R4], [ult_nume_col])) pvt
编辑2:感谢Giorgi,我设法找到了解决方案!这是最终的代码,这些代码确切地显示了我如何使用这些列:
declare @SQL nvarchar(max), @Cols nvarchar(max)
select @Cols =
stuff(
(
select ', ' + quotename(dt)
from
(
select TOP 100 PERCENT Sv.ID, Sv.ReportColumnName as dt
from Surveys AS Sv
ORDER BY Sv.ID
) X
ORDER BY X.ID FOR XML PATH('')
),1,1,''
)
SELECT @Cols
SET @SQL = ';
WITH cte
AS ( SELECT Sv.CreateDate, Sv.ReportColumnName, Sc.SectionName, SSSV.SectionScoreValue
FROM Surveys AS Sv
INNER JOIN Sections_Surveys__ScoreValues AS SSSV
ON SSSV.FK_Surveys_ID = Sv.ID
INNER JOIN Sections AS Sc
ON Sc.ID = SSSV.FK_Sections_ID
INNER JOIN Sections_Surveys AS SS
ON SS.FK_Surveys_ID = Sv.ID
AND SS.FK_Sections_ID = Sc.ID
INNER JOIN ScoreCategories AS ScoreC
ON ScoreC.ID = SSSV.FK_ScoreCategories_ID
)
SELECT SectionName , ' + @Cols + '
FROM cte PIVOT ( MAX(cte.SectionScoreValue) FOR cte.ReportColumnName IN (' + @Cols + ') ) pvt'
print @sql
execute (@sql)
感谢所有帮助人员,并感谢“投票”(如果我自己能获得结果,我将不会在这里发布)。
进行透视拨号时,请始终使用表表达式。像这样的东西:
SET @SQL = ';
WITH cte
AS ( SELECT SSSV.SectionScoreValue ,
Sv.ReportColumnName ,
Section
FROM Surveys AS Sv
INNER JOIN Sections_Surveys__ScoreValues AS SSSV ON SSSV.FK_Surveys_ID = Sv.ID
INNER JOIN Sections AS Sc ON Sc.ID = SSSV.FK_Sections_ID
INNER JOIN Sections_Surveys AS SS ON SS.FK_Surveys_ID = Sv.ID AND SS.FK_Sections_ID = Sc.ID
INNER JOIN ScoreCategories AS ScoreC ON ScoreC.ID = SSSV.FK_ScoreCategories_ID
)
SELECT Section , ' + @Cols + '
FROM cte PIVOT ( MAX(SSSV.SectionScoreValue) FOR Sv.ReportColumnName IN (' + @Cols + ') ) pvt'
您也可以看看我对类似问题的回答:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句