2010-01-31 31 views
11

Mam tabeli, który wygląda tak:Czy można SQL Server Pivot bez znajomości wynikowych nazw kolumn?

Month  Site   Val 
2009-12 Microsoft  10 
2009-11 Microsoft  12 
2009-10 Microsoft  13 
2009-12 Google   20 
2009-11 Google   21 
2009-10 Google   22 

I chcę dostać stolik 2-wymiarowy, który daje mi „val” za miesiąc każdym miejscu, na przykład:

Month  Microsoft  Google 
2009-12  10   20 
2009-11  12   21 
2009-10  13   22 

Ale Połów jest, nie znam wszystkich możliwych wartości, które mogą być w "Witrynie". Jeśli pojawi się nowa witryna, chcę automatycznie uzyskać nową kolumnę w wynikowej tabeli.

Wszystkie próbki kodu, które widziałem, mogą to zrobić, wymagające zastosowania kodu "Microsoft i Google" w tekście zapytania.
I saw one that didn't, ale w zasadzie udawało ono, wyświetlając strony i generując zapytanie w locie (konkatując ciąg znaków), który zawierał nazwy kolumn.

Nie ma sposobu, aby uzyskać SQL Server 2008, aby to zrobić bez takiego hack?

UWAGA: Muszę być w stanie uruchomić to jako zapytanie, które wysyłam z ASP.Net, nie mogę wykonywać procedur przechowywanych lub innych podobnych rzeczy.

Dzięki!
Daniel

+0

Co szukanie powinno być możliwe poprzez wykonanie zapytania w czasie wykonywania przy użyciu 'exec (@sql)' zobacz [tutaj] (http://stackoverflow.com/questions/15752112/). – surfmuggle

Odpowiedz

6

Podany przykład użycia dynamicznego SQL. Niestety, nie ma innej wbudowanej metody do przechwytywania w SQL Server, gdy kolumny wyjściowe nie są znane z góry.

Jeśli dane nie są zbyt duże, najprościej jest po prostu uruchomić zwykłe zapytanie wiersza z ASP.NET i wykonać przestaw w kodzie aplikacji. Jeśli dane są bardzo duże, musisz wygenerować SQL dynamicznie po pierwszym zapytaniu o możliwe wartości kolumn.

Należy zauważyć, że w rzeczywistości nie trzeba pisać instrukcji SQL, która generuje dynamiczny SQL; możesz po prostu wygenerować SQL w ASP.NET, a to najprawdopodobniej będzie znacznie łatwiejsze. Po prostu nie zapomnij o uniknięciu wartości Site, zanim rzucisz je w wygenerowane zapytanie, i nie zapominaj o parametryzowaniu jakichkolwiek części instrukcji SQL, które normalnie byłyby wykonywane bez przestawienia.

-1

wybierz miesiąc, min (przypadek, gdy strona 'microsoft'then val koniec) Microsoft, min (miejsce przypadek, kiedy' google'then val koniec) google z withoutpivot grupy przez miesiąc

select main.month, 
m.val as microsoft, 
g.val as google 
from withoutpivot main 
inner join withoutpivot m on m.month=main.month 
inner join withoutpivot g on g.month=main.month 
where m.site='microsoft' 
and g.site='google'