我有以下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,'')
我曾尝试与张贴在此topic答案乱搞,但我无法得到查询运行。我希望有人能帮忙。
编辑我只注意到我行是出的订单,并希望通过[自定义ID]以及排序。
您的想法是对的,您可以在'#TempTable'之后但在FOR XML PATH('')'之前添加'ORDER BY DATEPART(m,[Inv Date])'。在一个不相关的,也不是非常重要的说明中,我认为最好使用'EXECUTE SP_EXECUTESQL @ Query',而不是'EXECUTE(@Query)',[Aaron Bertrand](http://stackoverflow.com/users/ 61305 /)也有[博客关于它](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/17/bad-habits-to-kick-using-exec-instead-of-sp-executesql .aspx)在他的坏习惯踢系列。 – GarethD