在SQL Server 2012中使用具有varchar数据类型的两列进行透视连接

时间:2016-06-17 20:23:10

标签: sql sql-server sql-server-2012 pivot-table

我需要使用pivot从以下数据创建时间表:

enter image description here

我正在使用此查询

select 
    start_time, end_time, s.subj_name, tt.dd
from 
    time_table tt 
inner join 
    subj s on tt.subjid = s.subjid 

我可以将结果转移到

enter image description here

我使用以下SQL代码来执行此操作:

--Declare necessary variables
DECLARE   @SQLQuery AS NVARCHAR(MAX)
DECLARE   @PivotColumns AS NVARCHAR(MAX)

--Get unique values of pivot column  
SELECT @PivotColumns = COALESCE(@PivotColumns + ',','') + QUOTENAME(dd)
FROM (SELECT DISTINCT(dd)
      FROM time_table tt
      WHERE divid = 1 AND tt.active = 1) AS PivotExample

SELECT @PivotColumns

--Create the dynamic query with all the values for 
--pivot column at runtime
SET   @SQLQuery = 
    N'SELECT start_time,end_time, ' +   @PivotColumns + ' 
    FROM [dbo].[time_table]  
    PIVOT( SUM(subjid) 
          FOR dd IN (' + @PivotColumns + ')) AS P' 

SELECT   @SQLQuery

--Execute dynamic query
EXEC sp_executesql @SQLQuery

请帮助我将主题名称作为值而不是subjectid

2 个答案:

答案 0 :(得分:0)

由于您要转移VARCHAR,因此无法使用SUM,但必须使用MAXMIN

尝试改为:

SET   @SQLQuery = 
    N'SELECT start_time,end_time, ' +   @PivotColumns + ' 
    FROM [dbo].[time_table]  
    PIVOT( MAX(subjectname) 
          FOR dd IN (' + @PivotColumns + ')) AS P'

答案 1 :(得分:0)

找到它的答案,它提供了更简单的方法来获得它。 click to get answer