如何在SQL Server 2008中将行更改为列(多个表,联接等)

XYZ

我需要为调查应用程序创建报告时需要帮助。涉及5个主要表:

  • 调查(ID,ReportColumnName)
  • 节(ID,SectionName)
  • Surveys_Sections(FK_调查,FK_Sections,有效)
  • Sections_Surveys_ScoreValues(FK_Surveys,FK_Sections,FK_ScoreCategories,SectionScoreValue)
  • ScoreCategories(ID,ScoreStart,ScoreEnd,CategoryName)

每次创建调查时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)

感谢所有帮助人员,并感谢“投票”(如果我自己能获得结果,我将不会在这里发布)。

乔基·纳库里(Giorgi Nakeuri)

进行透视拨号时,请始终使用表表达式。像这样的东西:

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'

您也可以看看我对类似问题的回答:

基于“一列的总和除以另一列的总和”的SQL Pivot查询

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Sql Server 2008 R2中将列转换为行?

在SQL Server中将行更改为列

如何在SQL Server 2012中将数据类型从日期更改为int?

如何在SQL Server中将多个表插入多个表

如何在SQL Server中联接多个表?

如何在SQL Server中将表数据的值更改为“可用”?

如何在SQL Server中将列的数据类型从整数更改为文本?

如何在SQL Server 2008中将month-yyyy文本列转换为日期列

自联接SQL Server 2008中的表

如何在 SQL Server 中重塑表?

如何在SQL Server中透视表?

如何在MS SQL SERVER 2008 R2中将nvarchar列转换为日期时间类型

如何在SQL Server 2016中将现有表列修改为HIDDEN?

如何在SQL Server 2008中复制列数据?

如何在SQL Server 2008中读取XML列?

如何在SQL Server 2012中使用多个表进行外部交换联接?

如何在sql server 2008中将当前年份转换为当前日期

如何在SQL Server 2008中将字符串转换为整数?

如何在SQL Server 2008中将数据转换为json格式?

如何在SQL Server 2008 R2中将小数转换为科学

如何在SQL Server中透视列

如何在SQL Server中透视列?

如何在SQL Server中将行转换为列?

如何在 SQL Server 中将员工值行与列分开

如何在SQL Server中使用存储过程将重复值更改为列中的唯一值

SQL Server:将行更改为列的最快方法

如何在 sql server 2008 中将日期与 GETDATE() 进行比较

如何在SQL Server中“使用”架构

如何在SQL Server中安装Wordpress