【问题标题】:sql server sort dynamic pivot on large set of datasql server 对大量数据进行动态排序
【发布时间】:2017-10-27 06:57:57
【问题描述】:

我无法根据大量数据对数据进行排序。我看过很多例子,但似乎没有一个能解决音量问题——或者我可能只是遗漏了一些东西。我在这里进行了很好的查看:Sort Columns For Dynamic PivotPIVOT in sql 2005 并找到了很多好的建议,但我仍然找不到对我的枢轴进行排序的正确方法。

我正在使用以下 sql。它旋转列,但需要对结果进行排序以提高可读性:

SELECT a.* INTO #tempA 
FROM (SELECT top (5000) id, email, CONVERT(varchar,ROW_NUMBER() OVER 
(PARTITION BY email ORDER BY id)) AS PIVOT_CODE FROM Email) a 
order by PIVOT_CODE

DECLARE @cols AS NVARCHAR(MAX),
@sql  AS NVARCHAR(MAX)

SELECT @cols =STUFF((SELECT DISTINCT ', ' + QUOTENAME(col)
                FROM #tempA WITH (NOLOCK)
                cross apply
                (
                    SELECT 'id_' + PIVOT_CODE, id

                ) c (col, so)
                group by col, so
                --order by col

        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

set @sql = 'SELECT email, '
+@cols+
'INTO ##AnotherPivotTest FROM
(
   SELECT email,
       col,
       value
   FROM #tempA WITH (NOLOCK)
   cross apply
   (
    values
      (''id_'' + PIVOT_CODE, id)
   ) c (col, value)
) d
pivot
(
  max(value)
  for col in ('
            + @cols+            
            ')
) piv'

EXEC (@sql)

SELECT * FROM ##AnotherPivotTest 

结果看起来很混乱:

==============================================================================================
| email    | id_19 | id_24 | id_2 | id_16 | id_5 | id_9 | id_23 | .... | id_1 | .... | id_10 |
==============================================================================================
| xx@yy.dk | NULL  | NULL  | NULL | NULL  | NULL | NULL | NULL  | NULL | 1234 | NULL | NULL  |
==============================================================================================

我非常希望对 ID 进行排序 - 从 id_1 开始。

如您所见,我试图在“cols”的选择中放置“order by”,但这给了我错误:“如果指定了 SELECT DISTINCT,则 ORDER BY 项目必须出现在选择列表中。”如果没有 DISTINCT,我会收到另一个错误:“选择列表中的元素数量超过了 4096 个元素的最大允许数量。”

我被困住了,所以任何帮助都将不胜感激!

【问题讨论】:

    标签: sql sql-server sql-server-2008 sorting pivot


    【解决方案1】:

    不确定是什么导致了问题,但我通过将来自 tempA 的数据插入另一个临时表并在那里对其进行排序解决了我的数据透视表中的订单问题

     INSERT INTO #tempB
        SELECT * FROM #tempA
        ORDER BY PIVOT_CODE
    

    然后像这样选择不同的:

        SELECT @cols = @cols + QUOTENAME(PIVOT_CODE) + ',' FROM (SELECT DISTINCT PIVOT_CODE FROM #tempB ORDER BY PIVOT_CODE)
        SELECT @cols = SUBSTRING(@cols, 0, LEN(@cols)) --trims "," at end
    

    【讨论】:

    • 嗯...这些值在#tempB 中得到很好的排序。但是在旋转#tempB 之后,id_2 现在直接出现在 id_19 之后,然后是 id_16...奇怪...
    【解决方案2】:

    您也可以只使用光标来确定您的列和它们的顺序

    按列排序的光标

      declare @gruppe nvarchar(max)
      declare @gruppeSql nvarchar(max)
      declare @SQL nvarchar(max)
    
      DECLARE myCustomers CURSOR FOR
      select top 10  FirstName from [dbo].[DimCustomer] Order by FirstName
    
      set @gruppeSql = ''
    
      OPEN myCustomers
       FETCH NEXT FROM myCustomers INTO @gruppe
      IF (@@FETCH_STATUS>=0)
      BEGIN
      SET @gruppeSql = @gruppeSql +'[' +@gruppe+']'
      FETCH NEXT FROM myCustomers INTO @gruppe
       END
       WHILE (@@FETCH_STATUS<>-1)
       BEGIN
       IF (@@FETCH_STATUS<>-2)
    
       SET @gruppeSql = @gruppeSql  + ',[' +@gruppe+']'
       FETCH NEXT FROM myCustomers INTO @gruppe
       END
       CLOSE myCustomers
       DEALLOCATE myCustomers 
    
      SET @gruppeSql = replace(@gruppesql,'''','')
      /*Select to preview your cols*/
      select @gruppeSql
    

    动态枢轴

           SET @SQL = '
       Select *
      from
      (
       SELECT SalesAmount, FirstName
        FROM [AdventureWorksDW2014].[dbo].[FactInternetSales] a inner join dbo.DimCustomer b on a.CustomerKey = b.CustomerKey
    
      ) x
      pivot
      (
        sum(SalesAmount)
        for FirstName in ('+@gruppesql+')  
      ) p'
    
      print @sql
      exec(@sql)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      相关资源
      最近更新 更多