Mat*_*att 2 sql sql-server-2008
我有以下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
Run Code Online (Sandbox Code Playgroud)
我相信它必须对查询的这一部分做一些事情:
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,'')
Run Code Online (Sandbox Code Playgroud)
我确实尝试了解本主题中发布的答案,但我无法运行查询.我希望有人可以提供帮助.
编辑我刚注意到我的行已经乱序,并且也想按[Cust 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,'')
Run Code Online (Sandbox Code Playgroud)
更新: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,'')
Run Code Online (Sandbox Code Playgroud)
如果不能简单地使用列名,则可能需要在子查询中添加"排序"字段,并且可以将任何字段添加到子查询中,只要它们不会中断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,'')
Run Code Online (Sandbox Code Playgroud)