显示具有不同值(和空值)的相同列

我很新的SQL,我有这个问题。

CREATE TABLE #TempTable (WeekNr int, Name varchar(30), Value int) INSERT INTO #TempTable VALUES (21,'John',100) INSERT INTO #TempTable VALUES (21,'Michael',133) INSERT INTO #TempTable VALUES (21,'Tony',50) INSERT INTO #TempTable VALUES (22,'John',80) INSERT INTO #TempTable VALUES (23,'Michael',188) INSERT INTO #TempTable VALUES (23,'Tony',230) 

表格显示了这种方式:

  WeekNr Name Value 21 John 100 21 Michael 133 21 Tony 50 22 John 80 23 Michael 188 23 Tony 230 

我需要这样安排数据:

  Name Vale Name Value Name Value John 100 John 80 Michael 188 Michael 133 Tony 230 Tony 50 

其中前两列是WeekNr是21,SecondN到WeekNr是22,然后WeekNr是23。

如果不包含任何WeekNr,那么包含Null值会更好。 例如,如果我做类似的事情

  DELETE FROM #TempTable WHERE WeekNr = 22 

它应该看起来像这样:

  Name Vale Name Value Name Value John 100 Michael 188 Michael 133 Tony 230 Tony 50 

所以很容易将数据导出到Excel。 我需要使用PIVOT还是UNPIVOT?

尝试这个。

 SELECT Max([21]) NAME,Max([id21]) Value,Max([22]) Name,Max([id22]) Value,Max([23]) Name,Max([id23]) Value FROM (SELECT Row_number()OVER(partition BY WeekNr ORDER BY NAME) rn, NAME,value,WeekNr, 'id' + CONVERT(VARCHAR, WeekNr) AS weeks FROM #TempTable) a PIVOT (Max(NAME) FOR WeekNr IN ([21],[22],[23])) piv PIVOT (max(value) FOR weeks IN ([id21],[id22],[id23])) piv1 GROUP BY rn 

如果你想让代码dynamic工作,那么试试这个。

 DECLARE @cols VARCHAR(max)='', @cols1 VARCHAR(max)='', @aggcols VARCHAR(max)='', @aggcols1 VARCHAR(max)='', @sql NVARCHAR(max) SELECT @cols += ',[' + CONVERT(VARCHAR(30), weeknr)+']', @cols1 += ',[id' + CONVERT(VARCHAR(30), weeknr)+']', @aggcols += ',max([' + CONVERT(VARCHAR(30), weeknr)+ ']) Name', @aggcols1 += ',max([id' + CONVERT(VARCHAR(30), weeknr)+ ']) Value' FROM (SELECT DISTINCT WeekNr FROM #TempTable) A select @cols= RIGHT(@cols,len(@cols)-1) select @cols1= RIGHT(@cols1,len(@cols1)-1) select @aggcols= RIGHT(@aggcols,len(@aggcols)-1) select @aggcols1= RIGHT(@aggcols1,len(@aggcols1)-1) set @sql ='SELECT '+@aggcols+','+@aggcols1+' FROM (SELECT Row_number()OVER(partition BY WeekNr ORDER BY NAME) rn, NAME,value,WeekNr, ''id'' + CONVERT(VARCHAR, WeekNr) AS weeks FROM #TempTable) a PIVOT (Max(NAME) FOR WeekNr IN ('+@cols+')) piv PIVOT (max(value) FOR weeks IN ('+@cols1+')) piv1 GROUP BY rn' exec sp_executesql @sql 

这不是你应该用SQL来做的事情。 不要用SQL来完成,开发和维护会很复杂。

SQL帮助你检索你的数据,你可以做一些演示的东西,但只要它变得太复杂,你就知道你的方法是错误的。 您应该在您的前端应用程序中进行这种演示

我也不是SQL Server的专家,事实上,我对它还是比较陌生的。 我不认为这是可能的任何简单的方法。 我能想到的最好的事情是运行三个不同的查询,在那里你将有一个Where条件说明这样的事情:

 SELECT Name, Value FROM #TempTable WHERE WeekNr = 21 GO SELECT Name, Value FROM #TempTable WHERE WeekNr = 22 GO SELECT Name, Value FROM #TempTable WHERE WeekNr = 23 GO 

那么当你运行整个查询时,它会给你三个窗口的数据,但没有按照你想要的方式组织。 问题是,如果你有几百或几千个WeekNr值,这几乎不可能实现和运行。