如何选择不同的值并将差异作为同一个表中的单独列

时间:2015-03-05 13:09:32

标签: sql-server select distinct

我在课程和辅导员之间有一对多的关系。外键位于Course表中。如何选择辅助员作为独立者,并将其多个课程ID作为辅导员旁边的列。

SELECT dbo.Facilitator.Fac_ID, dbo.Facilitator.Fac_Name, dbo.Course.Course_ID
FROM dbo.Course 
RIGHT JOIN dbo.Facilitator ON dbo.Course.FK_Facilitator = dbo.Facilitator.Fac_ID 
order by dbo.Facilitator.Fac_Name asc

返回:

enter image description here

相反,我想:

enter image description here

1 个答案:

答案 0 :(得分:0)

对于旋转,应定义列名称。在您的情况下,根据您的问题,您没有这样的列名。所以我们创建样本列名称,如1,2等。

首先,获取pivot

的列名
DECLARE @cols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + COLUMNNAME + ']', '[' + COLUMNNAME + ']')
               FROM    
               (
                   -- Generates random column names numerically from 1,2 etc
                   SELECT DISTINCT CAST(ROW_NUMBER() OVER(PARTITION BY ID ORDER BY (SELECT 0))AS VARCHAR(4))COLUMNNAME 
                   FROM #TEMP
               ) PV 
               ORDER BY CAST(COLUMNNAME AS INT)

现在转动结果。我在里面写了逻辑。

DECLARE @query NVARCHAR(MAX)
SET @query = '-- This outer query forms your pivoted result
             SELECT * FROM 
             (
                -- Source data for pivoting                
                SELECT ID,NAME,VALUE,
                CAST(ROW_NUMBER() OVER(PARTITION BY ID ORDER BY (SELECT 0))AS VARCHAR(4)) COLUMNNAME  
                FROM #TEMP 
             ) x
             PIVOT 
             (
                 --Defines the values in each dynamic columns
                 MIN(VALUE)
                 -- Get the names from the @cols variable to show as column
                 FOR COLUMNNAME IN (' + @cols + ')
            ) p            
            ORDER BY NAME;' 

EXEC SP_EXECUTESQL @query