Sql server 动态将sql server中的行转换为列(不含聚合)
嗨 我有以下数据: ------------------------------------------Sql server 动态将sql server中的行转换为列(不含聚合),sql-server,dynamic,pivot,Sql Server,Dynamic,Pivot,嗨 我有以下数据: ------------------------------------------母题文章|儿童文章|-----------------------12341 12445 |12341 12446 |12341 12447 |12342 | 44875 |12342 12442 124876---------------------------------- 这是我的预期结果集: 12341 | 12342 |--------12345 | 44875 |-------
母题文章|儿童文章|
-----------------------
12341 12445 |
12341 12446 |
12341 12447 |
12342 | 44875 |
12342 12442 124876---------------------------------- 这是我的预期结果集:
12341 | 12342 |
--------
12345 | 44875 |
--------
12346 | 44876 |
--------
12347 | NULL |
--------
12347 12447 | NULL |
------------------------- 我有这个,但它只显示了一行,因为聚合max(childarticle)。有没有办法查询不带聚合的动态表
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(Masterarticle)
from table
group by Masterarticle
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT ' + @cols + N' from
(
select childarticle, Masterarticle
from table
) x
pivot
(
max(childarticle)
for Masterarticle in (' + @cols + N')
) p '
exec sp_executesql @query;
您所需要做的就是向用于透视的查询中添加一个行号 然后,枢轴将在计算出的行数上分组,并返回多于1行的数据 使用仅存在于会话中的临时表的示例: 返回:
那么,您预期的结果集是什么?这两组数据都在您的表中吗?请给出您想要的预期结果。对不起,请参见上文。好的,我无法修改sql表。但从DECLARE开始,一切都很完美!非常感谢@BatchEchoff不确定为什么需要修改sql表。我只是用了一张临时桌子来演示。因为其他人更容易验证它是否有效。:)
IF OBJECT_ID('tempdb..#tmpTestTable') IS NOT NULL DROP TABLE #tmpTestTable;
create table #tmpTestTable (Masterarticle int, Childarticle int);
insert into #tmpTestTable (Masterarticle, Childarticle) values
(12341, 12345),(12341, 12346),(12341, 12347),
(12342, 44875),(12342, 44876);
DECLARE @cols AS NVARCHAR(MAX) = STUFF((SELECT ',' + QUOTENAME(Masterarticle) from #tmpTestTable group by Masterarticle FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'');
--select @cols;
DECLARE @query AS NVARCHAR(MAX) = N'SELECT ' + @cols + N'
from (
select Masterarticle, Childarticle,
row_number() over (partition by Masterarticle order by Childarticle) as RN
from #tmpTestTable
) x
pivot (max(childarticle) for Masterarticle in (' + @cols + N')) pvt';
exec sp_executesql @query;
12341 12342
----- -----
12345 44875
12346 44876
12347 NULL