2009-07-13 55 views
6

Tôi đang làm việc trên một truy vấn trục động trên một bảng có chứa:SQL động Pivot - làm thế nào để đặt hàng cột

  • OID - OrderID
  • Size - kích thước của sản phẩm
  • BucketNum - các ra lệnh rằng kích thước nên đi
  • lượng - có bao nhiêu lệnh

cột kích thước chứa kích cỡ khác nhau dependi trên OID.

Vì vậy, sử dụng mã tìm thấy here, tôi đặt này với nhau:

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) 

này hoạt động tuyệt vời ngoại trừ các tiêu đề cột (các kích thước nhãn) không theo thứ tự dựa trên các cột bucketnum. Các theo thứ tự dựa trên kích thước.

Tôi đã thử Lệnh tùy chọn Theo sau trục xoay, nhưng điều đó không hoạt động.

Làm cách nào để kiểm soát thứ tự các cột xuất hiện?

Cảm ơn bạn

Trả lời

7

Bạn cần phải sửa lỗi này:

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

Để trở về các cột theo thứ tự đúng. Bạn có thể phải làm một cái gì đó như thế này thay vì sử dụng DISTINCT:

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

Ahhhhh! Các 'MIN (BucketNum)' bit là những gì tôi cần !! Cảm ơn bạn, cảm ơn bạn! – GernBlandston

0

tôi thấy liên kết này chỉ ngày hôm nay, trong đó sử dụng một CTE để xây dựng danh sách cột (trong đó, có lẽ, bạn có thể đặt hàng) một cách nhanh chóng mà không có sự cần cho sql động:

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

+0

Cảm ơn, Joel. Tôi đã không nhìn thấy nó, nhưng tôi sẽ kiểm tra nó ra! – GernBlandston

+1

Giải pháp đó là không động chỉ trong tên của các cột, không phải trong số cột, mà vẫn sẽ cần một kỹ thuật năng động tại thời điểm hoạt động của trục. Tôi đã sử dụng kỹ thuật đó để xoay vòng phạm vi ngày biến đổi, tuy nhiên nó luôn luôn là 12 tháng, nhưng bắt đầu từ những tháng khác nhau - đó là một biến đổi trượt cơ bản. –

0

tôi đã cùng một vấn đề và cố gắng giải pháp gợi ý ở trên nhưng, có lẽ do trình độ của tôi về sự hiểu biết, không thể có được nó để làm việc. Tôi tìm thấy một hack đơn giản là tạo một bảng Temp với các tiêu đề cột được sắp xếp một cách chính xác bằng cách sử dụng Order by statements và sau đó kéo vào danh sách đó để biến đặt tên cột truy vấn động.

ví dụ:

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 

Đã xử lý.

Hy vọng rằng sẽ giúp ai đó.

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

Mặc dù truy vấn này có thể trả lời câu hỏi, bạn có thể cung cấp thêm một chút thông tin về cách hoạt động của câu trả lời này không? – JAL

+0

Nó hoạt động giống như mã trong bài gốc nhưng nó tạo ra một bí danh cho cột để nó có thể có một ORDER BY được áp dụng cho nó. – frustratedInFresno

Các vấn đề liên quan