当前位置: 首页 > 面试题库 >

为动态数据透视表排序列

贝凯
2023-03-14
问题内容

我有以下SQL查询,其中创建的列不按顺序,我不太确定如何解决它。

SELECT rhead.rhcust AS [Cust ID], rdetl.rdextp AS [Inv Amt], rhead.rhivdt AS [Inv Date]
INTO #TempTable
FROM rhead
LEFT OUTER JOIN rdetl
    ON rhead.rhinvc = rdetl.rdinvc
WHERE rhead.rhivdt >= '01-01-2012' AND rhead.rhivdt <= '12-25-12'

ALTER DATABASE Vista_TM SET COMPATIBILITY_LEVEL = 100

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Month'+cast(DATEPART(m, [Inv Date]) as varchar(2))) 
                    from #TempTable
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')

set @query = 'SELECT [Cust ID],' + @cols + ' 
            from 
            (
                SELECT [Cust ID], [Inv Amt],
                  ''Month''+cast(DATEPART(m, [Inv Date]) as varchar(2)) MonthNo
                FROM #TempTable
            ) x
            pivot 
            (
                sum([Inv Amt])
                for MonthNo in (' + @cols + ')
            ) p '

execute(@query)

DROP TABLE #TempTable

我相信它与查询的这一部分有关系:

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Month'+cast(DATEPART(m, [Inv Date]) as varchar(2))) 
                    from #TempTable
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')

我曾尝试弄乱本主题中发布的答案,但无法运行查询。我希望有人能提供帮助。

编辑 我只是注意到我的行是乱序的,也想按[客户ID]进行排序


问题答案:

您可以通过在ORDER BY设置@cols字符串时添加来调整动态数据透视查询中字段的顺序:

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Month'+cast(DATEPART(m, [Inv Date]) as varchar(2))) 
                    from #TempTable
                    ORDER BY ....
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')

更新:DISTINCT首先错过了,使用时DISTINCT必须先使用子查询,然后再使用ORDER BY

SELECT @cols = STUFF((SELECT ',' +   QUOTENAME(ColName) 
                    FROM (SELECT DISTINCT 'Month'+cast(DATEPART(m, [Inv Date]) as varchar(2)) ColName
                          FROM #TempTable
                          )sub
                    ORDER BY ColName
                    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')

如果您不能简单地使用列名,则可能需要在子查询中添加“排序”字段,并且可以在子查询中添加任何字段,只要它们不会破坏DISTINCT列表即可。例如:

SELECT @cols = STUFF((SELECT ',' +   QUOTENAME(ColName) 
                    FROM (SELECT DISTINCT 'Month'+cast(DATEPART(m, [Inv Date]) as varchar(2)) ColName
                                          ,CASE WHEN field = 'something' THEN 1
                                                WHEN field = 'something else' THEN 2
                                                ELSE 3
                                           END as Sort
                                          ,Cust_ID
                          FROM #TempTable
                          )sub
                    ORDER BY Sort,Cust_ID
                    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')


 类似资料:
  • 对于给定的数据帧: 我如何手动重新排列列反正我想要它,例如,如果我想要以下序列: 因此,表格和绘图将采用以下方式:

  • 问题内容: 我已经尽力理解如何在SQL中创建数据透视表,但是我无法对其进行管理! 我有以下几列: 拥有60万行数据。 我在下面的数据透视表中需要它们; StartHour作为列标题 作为行标题 作为数据 其中=‘1’作为过滤器。 数据透视表 我设法获得了以下代码,该方法有效,但仅给我date_1作为列标题,而不给我StartHour,或者将filter作为date_source =‘1’。 谢谢你

  • 问题内容: 我试图获得一个带有动态列的数据透视表。当user_id是一个字符串时,它可以正常工作,但是如果它是一个int,那么它似乎会失败 到目前为止,在过去的问题帮助下,我得到的是: 参见:http : //sqlfiddle.com/#!2/eab24/1 我确定这很简单,但是我想念什么呢? 谢谢 问题答案: 由于值在其中,因此您要将它们设为列名,因此必须将值包装在反引号中 该SQL将看起来像

  • 问题内容: 我找到了一个不错的脚本,该脚本可以为透视表动态按列名创建,但是我没有将分配的值重新返回到表中。这是我的出发桌。 我运行此SQL生成我想要的数据透视表中的列 这给了我以下输出 当我为数据透视表运行动态SQL时 我看到这个结果… 我尝试了几种不同的方法,但是对于这种方法为什么不起作用,我没有提出解决方案。 所需的输出将是ORDER_ID列顺序正确的位置 但这也将对我的应用程序起作用。 问题

  • 问题内容: 第一次尝试熊猫,我试图先按照索引对数据透视表进行排序,然后再对一系列值进行排序。 到目前为止,我已经尝试过: 按索引然后按值对数据透视表进行排序的正确方法是什么? 问题答案: 这是一个可以做您想要的解决方案: 结果将如下所示: 将其作为API方法内置到熊猫中会很好。虽然不确定应该是什么样。

  • 问题内容: 以下查询执行得很好… 输出看起来像 但是我的疑问是如何获取列的动态字段值。 那是 , 如何使用以上查询 问题答案: 要使PIVOT动态,您必须编写一个存储过程。 然后,您可以这样称呼它: