2016-06-28 48 views
-2

我有一个应该获取列作为col1col2 ...... col9col10动态选择查询,但它获取正确的col1col10col11col12col2 ....不知道由于查询是动态的,因此如何选择它们。选择编号列

请帮忙。

这是我一直在使用的动态选择。

-- CREATE THE COLUMNS REQUIRED 
SET @DYColumns = STUFF((SELECT DISTINCT 
    ',' + N'sourceID' 
    + CAST(ROW_NUMBER() 
      OVER (PARTITION BY prgmg_product_id ORDER BY prgmg_product_id, source_id_other) 
     AS NVARCHAR(10)) 
    FROM #Prgmg FOR XML PATH('')), 1, 1, ''); 
+6

显示您的查询!你如何编写查询? –

+0

代码片段比您的参数化问题更易于调试。 –

回答

0
Drop Table #Prgmg 
CREATE TABLE #Prgmg (
    prgmg_product_id INT 
    ,source_id_other INT 
    ); 

INSERT #Prgmg (
    prgmg_product_id 
    ,source_id_other 
    ) 
VALUES (3310,11478) 
    ,(3337,10833) 
    ,(3354,11466) 
    ,(4039,4846) 
    ,(4039,65454) 
    ,(4039,65456) 
    ,(13337,110833) -- Added to force over 10 
    ,(13354,111466) -- Added to force over 10 
    ,(14039,14846) -- Added to force over 10 
    ,(14039,165454); -- Added to force over 10 


DECLARE @DYColumns NVARCHAR(1000) 
    ,@DYSqlQuery NVARCHAR(4000); 

-- CREATE THE COLUMNS REQUIRED 
SET @DYColumns = STUFF((
      SELECT DISTINCT ',' 
        + N'sourceID' 
        + right('00'+CAST(ROW_NUMBER() OVER (ORDER BY prgmg_product_id, source_id_other) AS NVARCHAR(10)),2) 
      FROM #Prgmg 
      FOR XML PATH('') 
      ), 1, 1, ''); 



-- CREATE THE DYNAMIC SQL AND ADD IN THE CREATED COLUMNS 
SET @DYSqlQuery = ' 
    SELECT prgmg_product_id,' 
     + @DYColumns 
     + ' FROM (
       SELECT prgmg_product_id 
        ,CAST(N''sourceID'' + CAST(ROW_NUMBER() OVER (
         PARTITION BY prgmg_product_id ORDER BY prgmg_product_id, source_id_other 
         ) AS NVARCHAR(10)) AS NVARCHAR(100)) AS Col 
        ,source_id_other 
       FROM #Prgmg S1 
     ) X 
     PIVOT(MIN(source_id_other) FOR Col IN (' + @DYColumns + ')) P' 

Print @DYSqlQuery 
--EXECUTE sp_executesql @DYSqlQuery; 

退货 - 请注意列已排序。这是通过零填充Row_Number()

SELECT prgmg_product_id,sourceID01,sourceID02,sourceID03,sourceID04,sourceID05,sourceID06,sourceID07,sourceID08,sourceID09,sourceID10 FROM (
      SELECT prgmg_product_id 
       ,CAST(N'sourceID' + CAST(ROW_NUMBER() OVER (
        PARTITION BY prgmg_product_id ORDER BY prgmg_product_id, source_id_other 
        ) AS NVARCHAR(10)) AS NVARCHAR(100)) AS Col 
       ,source_id_other 
      FROM #Prgmg S1 
    ) X 
    PIVOT(MIN(source_id_other) FOR Col IN (sourceID01,sourceID02,sourceID03,sourceID04,sourceID05,sourceID06,sourceID07,sourceID08,sourceID09,sourceID10)) P 
0

如果使用COALESCE或STUFF建立自己的列,确保有一个ORDER BY

此外,你可以有COL01,col02 .. col10确保序列

+0

如何动态选择col01,col02,col03..then – Ramaswamy

+0

构建动态SQL有很多技巧。我将不得不看你的技巧来提供更好的建议。 –

+0

- 创建列REQUIRED SET @DYColumns = STUFF(( SELECT DISTINCT '' + N'sourceID” + CAST(ROW_NUMBER)OVER(PARTITION(BY prgmg_product_id ORDER BY prgmg_product_id,source_id_other)AS NVARCHAR(10) ) FROM #Prgmg FOR XML PATH('') ),1,1,''); 这是一个正在使用... – Ramaswamy