sql - sql server单行多列成一列

标签 sql sql-server sql-server-2008 tsql

我有这样的 table

Reg_No      Student_Name         Subject1    Subject2    Subject3    Subject4    Total
----------- -------------------- ----------- ----------- ----------- ----------- -----------
101         Kevin                85          94          78          90          347
102         Andy                 75          88          91          78          332

由此,我需要创建一个临时表或类似这样的表:
Reg_No      Student_Name         Subject     Total
----------- -------------------- ----------- -----------
101         Kevin                85          347
                                 94           
                                 78           
                                 90           
102         Andy                 75          332
                                 88           
                                 91           
                                 78           

有没有办法我可以在SQL Server中做到这一点?

最佳答案

检查this Fiddle

;WITH MyCTE AS
(
    SELECT    * 
    FROM      (
                  SELECT    Reg_No, 
                            [Subject1], 
                            [Subject2], 
                            [Subject3], 
                            [Subject4]
                  FROM      Table1
              )p
    UNPIVOT 
    ( 
        Result FOR SubjectName  in ([Subject1], [Subject2], [Subject3], [Subject4])
    )unpvt
)

SELECT    T.Reg_No,
          T.Student_Name,
          M.SubjectName,
          M.Result,
          T.Total
FROM      Table1 T
          JOIN MyCTE M
              ON T.Reg_No = M.Reg_No

如果您确实想在其余部分中使用NULL值,则可以尝试以下操作:

This is the new Fiddle

这是代码:
;WITH MyCTE AS
(
    SELECT    * 
    FROM      (
                  SELECT    Reg_No, 
                            [Subject1], 
                            [Subject2], 
                            [Subject3], 
                            [Subject4]
                  FROM      Table1
              )p
    UNPIVOT 
    ( 
        Result FOR SubjectName  in ([Subject1], [Subject2], [Subject3], [Subject4])
    )unpvt
),
MyNumberedCTE AS
(
    SELECT    *,
              ROW_NUMBER() OVER(PARTITION BY Reg_No ORDER BY Reg_No,SubjectName) AS RowNum
    FROM      MyCTE
)
SELECT    T.Reg_No,
          T.Student_Name,
          M.SubjectName,
          M.Result,
          T.Total
FROM      MyCTE M
          LEFT JOIN MyNumberedCTE N
              ON N.Reg_No = M.Reg_No
              AND N.SubjectName = M.SubjectName
              AND N.RowNum=1
          LEFT JOIN Table1 T
              ON T.Reg_No = N.Reg_No

关于sql - sql server单行多列成一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18527543/

相关文章:

java - Java 字符串到日期

sql - 数据库镜像: "witness" server what is it for?

asp.net - 尝试连接三个表时,SQL 查询不检索数据

mysql - 我如何编写查询以使用单个查询从 2 个表中选择顶部和底部的 3 个值?

sql - 带有 age() 函数的 Postgresql WHERE

sql-server - 在从 .net 传递到 SQL Server 的存储过程中解析 Xml 时出现问题

.net - SQL Server 2008 - HashBytes 计算列

sql - 在单个文本中将 SQL 表行与条件连接起来

mysql - 在 hasMany 关联上双重 JOIN 和 GROUP

sql-server - SQL Server 中的日期时间四舍五入为最接近的 15 分钟