2009-07-13 20 views
6

pracuję na dynamicznym zapytania obrotu na stole, który zawiera:SQL Dynamiczny pivot - jak zamówić kolumn

  • OID - OrderID
  • Size - rozmiar produktu
  • BucketNum - w postanowić, że rozmiary powinien iść
  • ilość - ile zamówił

kolumna rozmiar zawiera różne rozmiary dependi ng na OID.

Tak, przy użyciu kodu znaleźć here, kładę to razem:

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) 

Działa to doskonale z wyjątkiem, że nagłówki kolumn (etykiety rozmiary) nie są w takiej kolejności, w oparciu o kolumny bucketnum. Są w kolejności na podstawie rozmiarów.

Po wypróbowaniu próbowałem opcjonalnego Order By, ale to nie działa.

Jak kontrolować kolejność wyświetlania kolumn?

Dziękuję

Odpowiedz

7

Trzeba to naprawić:

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

Aby powrócić kolumny w odpowiedniej kolejności. Być może trzeba zrobić coś takiego zamiast korzystania DISTINCT:

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

Ahhhhh! "MIN (BucketNum)" był tym, czego potrzebowałem !! Dziękuję, dziękuję! – GernBlandston

0

Widziałem ten link tylko dzisiaj, który używa CTE zbudować listę kolumn (które przypuszczalnie można zamówić) w locie bez potrzebne dla dynamicznego SQL:

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

+0

Dzięki, Joel. Nie widziałem tego, ale sprawdzę to! – GernBlandston

+1

To rozwiązanie jest niedynamiczne tylko w nazwach kolumn, a nie w liczbie kolumn, które nadal wymagałyby techniki dynamicznej w czasie operacji na osi obrotu. Użyłem tej techniki do przestawiania zmiennych zakresów dat, jednak tam, gdzie zawsze jest 12 miesięcy, ale zaczyna się w różnych miesiącach - to podstawowa transformacja przesuwna. –

0

miałem ten sam problem i próbował rozwiązanie sugerowane powyżej, ale, prawdopodobnie ze względu na mój poziom zrozumienia, nie mógł zmusić go do pracy. Znalazłem prosty hack polegający na utworzeniu tabeli Temp z nagłówkami kolumn uporządkowanymi poprawnie za pomocą poleceń Sortuj według, a następnie wciągnięciem tej listy do zmiennej, która ustawia dynamiczne nazwy kolumn zapytania przestawnego.

np.

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 

Pracował uczta.

Mam nadzieję, że komuś pomóż.

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

Mimo że to zapytanie może odpowiedzieć na pytanie, czy możesz podać trochę więcej informacji o działaniu tej odpowiedzi? – JAL

+0

Działa to samo, co kod w oryginalnym wpisie, ale tworzy alias dla kolumny, aby mogło zostać zastosowane do niego ORDER BY. – frustratedInFresno