Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 动态将sql server中的行转换为列(不含聚合)_Sql Server_Dynamic_Pivot - Fatal编程技术网

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