【发布时间】:2021-08-19 11:33:14
【问题描述】:
我有这张桌子:
---------------------------------------
| Id | worker | workStation | amount
---------------------------------------
| 1 | John | Suspension | 5
| 2 | John | Wheels | 8
| 3 | Peter | Wheels | 1
| 4 | Peter | Engines | 2
---------------------------------------
我需要一个查询来显示:
-------------------------------------------
| worker | Suspension | Wheels | Engines
-------------------------------------------
| John | 5 | 8 | NULL
| Peter | NULL | 1 | 2
-------------------------------------------
借助 Efficiently convert rows to columns in sql server 和 https://docs.microsoft.com/es-es/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-ver15(主要是第一个)我实现了:
---------------------------------
| Suspension | Wheels| Engines
---------------------------------
| 5 | 8 | NULL
| NULL | 1 | 2
---------------------------------
这几乎是我需要的,但我仍然缺少知道工人姓名的列。
我需要查询以未知数量的工作站为中心。 我的代码是:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(workStation)
FROM TableName
group by workStation
ORDER BY workStation
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT ' + @cols + N' from
(
SELECT amount, worker, workStation
FROM TableName
) x
pivot
(
max(amount)
for workStationin (' + @cols + N')
) p '
exec sp_executesql @query;
我怎样才能得到这个缺失的列? 非常感谢您。
【问题讨论】:
-
您刚刚错过了动态声明中的
worker列。如果应该在您的SELECTs 中。如果您不要求,则不会返回列。调试动态语句的最简单方法是PRINT/SELECT它,在那里解决问题,然后传播解决方案。如果您PRINT您的动态语句,您将很快看到需要将列Worker放入语句中的位置,以及需要将其放入动态语句中的位置。 -
我不太明白
PRINT我的动态声明是什么意思。你的意思是我应该添加PRINT @query?我唯一看到的是我已经在使用的代码。 -
字面意思是我所说的。
PRINT @query;/SELECT @query;这将为您提供正在执行的动态语句。 -
谢谢!它工作正常,我得到了需要更改
SELECT @query的查询,但这样做不是动态的。当我试图在原版中实现它时,我得到了已经有效的this answer。我将使用这些命令来解决未来的问题!
标签: sql sql-server select pivot rows