2009-07-13 42 views
6

SQL动态透视 - 如何订购我的工作,它包含一个表上的动态支点查询列

  • OID - 订单ID
  • 尺寸 - 产品
  • BucketNum的大小 - 下令大小 应该去
  • 数量 - 有多少下令

大小列包含不同尺寸dependi在OID上。

因此,使用代码中发现here,我把这个在一起:

DECLARE @listCol VARCHAR(2000) 
DECLARE @query VARCHAR(4000) 

SELECT @listCol = STUFF((SELECT distinct '], [' + [size] 
          FROM  #t 
         FOR 
          XML PATH('') 
         ), 1, 2, '') + ']' 


SET @query = 'SELECT * FROM 
     (SELECT OID, [size], [quantity] 
      FROM #t 
      ) src 
PIVOT (SUM(quantity) FOR Size 
IN (' + @listCol + ')) AS pvt' 


EXECUTE (@query) 

这只是列标题(尺寸标签)不是基于bucketnum列顺序的伟大工程。这些都是基于尺寸的顺序。

我已经试过可选的顺序后透视,但不工作。

如何控制列出现的顺序?

谢谢

回答

7

你需要解决这个问题:

SELECT @listCol = STUFF((SELECT distinct '], [' + [size] 
          FROM  #t 
         FOR 
          XML PATH('') 
         ), 1, 2, '') + ']' 

要以正确的顺序返回列。您可能需要做这样的事情,而不是使用DISTINCT

SELECT [size] 
FROM  #t 
GROUP BY [size] 
ORDER BY MIN(BucketNum) 
+1

Ahhhhh! 'MIN(BucketNum)'位是我所需要的! 谢谢,谢谢! – GernBlandston 2009-07-13 21:30:13

0

我看到这个链接就在今天,它采用了CTE来即时构建列列表(其中,想必,你可以命令),而不需要动态SQL:

http://blog.stevienova.com/2009/07/13/using-ctes-to-create-dynamic-pivot-tables-in-sql-20052008/

+0

谢谢,乔尔。我没有看到它,但我会检查出来! – GernBlandston 2009-07-13 21:54:00

+1

该解决方案仅在列的名称中是非动态的,而不是在列的数量上,在透视操作时仍然需要动态技术。我已经使用该技术来调整可变的日期范围,但是它始终是12个月,但是从不同的月份开始 - 这是一个基本的滑动转换。 – 2009-07-13 22:02:17

0

我有同样的问题,并试图解决上述建议,但可能是由于我的了解程度,无法得到它的工作。我发现一个简单的方法是创建一个Temp列表,并使用Order by语句正确排列列标题,然后将该列表拖入设置动态数据透视查询列名称的变量中。

例如

SELECT WeekNum INTO #T3 
FROM #T2 
GROUP BY WeekNum 
ORDER BY MIN(WeekNum) 

SELECT @ColumnName1 = ISNULL(@ColumnName1 + ',','') + QuoteName(WeekNum) 
FROM (SELECT WeekNum From #T3) AS WeekNum 

工作过。

希望能帮助别人。

2
SELECT @listCol = STUFF(
     (SELECT DISTINCT ',' + QUOTENAME(size) AS [size] 
     FROM #t 
     ORDER BY [size] 
     FOR XML PATH('')