Sql 显示具有不同值(和空值)的相同列
我对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
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-很高兴有帮助:)