【发布时间】:2013-09-26 06:27:05
【问题描述】:
我有以下 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 也有blogged about it 在他的坏习惯中踢系列。跨度>
标签: sql sql-server-2008