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

Sql 显示具有不同值(和空值)的相同列,sql,sql-server,excel,Sql,Sql Server,Excel,我对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 V

我对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         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,第二列表示WeekNr为22,然后表示WeekNr为23

最好是包含空值,这样就不会跳过任何WeekNr。例如,如果我做了类似的事情

  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?

这不是SQL应该做的事情不要使用SQL,它的开发和维护会很复杂


SQL帮助您检索数据,您可以做一些表示的工作,但是一旦它变得太复杂,您就知道您使用了错误的方法您应该在前端应用程序中进行此类演示

我也不是SQL Server方面的专家,事实上,我对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值,那么以这种方式实现和运行几乎是不可能的。

试试这个

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
如果您想让代码动态工作,请尝试以下方法

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

这可能是一个前端工作?是的,我也想过在前端做这个。或者将数据存储在临时表中,然后使用简单的where条件选择它们。我想这是最好的方法。。。但是,由于我在过去的两天里一直在努力解决这个问题,我想知道如何只通过一个查询就完成它……您是否尝试过pradeep代码?我认为这是可行的,而且你的问题是现实的52@Anto-很高兴有帮助:)