Niektóre zostały customer_comments
podzielone na wiele wierszy ze względu na projekt bazy danych, a dla raportu muszę połączyć comments
każdy z unikalnych id
w jeden wiersz. Wcześniej próbowałem czegoś, co działa z tą ograniczoną listą z klauzuli SELECT i sztuczki COALESCE, ale nie mogę sobie tego przypomnieć i nie mogłem tego zapisać. Wydaje mi się, że nie mogę go uruchomić w tym przypadku, wydaje się, że działa tylko w jednym rzędzie.
Dane wyglądają następująco:
id row_num customer_code comments
-----------------------------------
1 1 Dilbert Hard
1 2 Dilbert Worker
2 1 Wally Lazy
Moje wyniki muszą wyglądać następująco:
id customer_code comments
------------------------------
1 Dilbert Hard Worker
2 Wally Lazy
Tak więc dla każdego row_num
jest naprawdę tylko jeden wiersz wyników; komentarze powinny być łączone w kolejności row_num
. Powyższa połączona SELECT
sztuczka działa, aby uzyskać wszystkie wartości dla określonego zapytania w jednym wierszu, ale nie mogę wymyślić, jak to zrobić, jako część SELECT
instrukcji, która wyrzuca wszystkie te wiersze.
Moje zapytanie musi samodzielnie przejść przez całą tabelę i wyprowadzić te wiersze. Nie łączę ich w wiele kolumn, po jednej dla każdego wiersza, więc PIVOT
wydaje się , że nie ma zastosowania.
źródło
order by
zapytania podrzędnego. To jest XML budynku zafor xml
i to sposób na budowanie XML przy użyciu TSQL. Kolejność elementów w plikach XML jest ważną kwestią i można na niej polegać. Jeśli więc ta technika nie gwarantuje porządku, obsługa XML w TSQL jest poważnie zepsuta.row_num desc
musi być zgodny zorder by
sugerowanym przez Mikaela). Mam zamiar usunąć komentarze sugerujące inaczej, ponieważ zapytanie zawiera prawoorder by
i mam nadzieję, że @JonSeigel rozważa zrobienie tego samego.Jeśli możesz używać CLR w swoim środowisku, jest to specjalnie dostosowany przypadek agregacji zdefiniowanej przez użytkownika.
W szczególności jest to prawdopodobnie właściwy sposób, jeśli dane źródłowe nie są trywialnie duże i / lub musisz często wykonywać tego typu czynności w swojej aplikacji. Podejrzewam, że plan zapytań dla rozwiązania Aarona nie będzie dobrze skalowany wraz ze wzrostem wielkości wejściowej. (Próbowałem dodać indeks do tabeli tymczasowej, ale to nie pomogło).
To rozwiązanie, podobnie jak wiele innych rzeczy, stanowi kompromis:
EDYCJA: Cóż, poszedłem sprawdzić, czy to rzeczywiście było lepsze, i okazuje się, że wymaganie, aby komentarze były w określonej kolejności, nie jest obecnie możliwe do spełnienia przy użyciu funkcji agregującej. :(
Zobacz SqlUserDefinedAggregateAttribute.IsInvariantToOrder . Zasadniczo, co trzeba zrobić, to
OVER(PARTITION BY customer_code ORDER BY row_num)
jednakORDER BY
nie jest obsługiwana wOVER
klauzuli podczas agregowania. Zakładam, że dodanie tej funkcji do programu SQL Server otwiera puszkę robaków, ponieważ to, co należałoby zmienić w planie wykonania, jest banalne. Wyżej wspomniany link mówi, że jest on zarezerwowany do wykorzystania w przyszłości, więc można go zaimplementować w przyszłości (w 2005 r. Prawdopodobnie nie masz szczęścia).Można to nadal osiągnąć poprzez spakowanie i parsowanie
row_num
wartości w zagregowanym ciągu, a następnie wykonanie sortowania w obiekcie CLR ... co wydaje się dość hackerskie.W każdym razie poniżej znajduje się kod, którego użyłem na wypadek, gdyby ktokolwiek uznał to za przydatne, nawet z ograniczeniami. Część hakerską zostawię jako ćwiczenie dla czytelnika. Zauważ, że użyłem AdventureWorks (2005) do danych testowych.
Montaż agregatu:
T-SQL do testowania (
CREATE ASSEMBLY
isp_configure
aby pominąć CLR):źródło
Oto rozwiązanie oparte na kursorach, które gwarantuje kolejność komentarzy według
row_num
. (Zobacz moją drugą odpowiedź dotyczącą sposobu[dbo].[Comments]
zapełniania tabeli).źródło
źródło