Pytanie w sprawie sql-server, tsql, coalesce, sql-server-2008 – Łącz wiele wierszy z wielu tabel

2

Sprawdziłemwiele inny Posty tutaj są dobrze znane z funkcji Coalesce, ale nie byłem w stanie dowiedzieć się, jak wykonać to konkretne zadanie.

Mam więc tabelę prowizji i tabelę kategorii. Stworzyłemtutaj dzięki czemu możesz zobaczyć dokładną strukturę danych z przykładowymi danymi. Zasadniczo tabela Komisji zawiera kolumny SalesRepID, LocationID, CategoryID, SurgeonID i CommissionPercent.

Używanie funkcji Coalesce, Udało mi się uzyskać coś takiego, przekazując SalesRepID, LocationID i SurgeonID:

<code>.05 (Shirts), .05 (Shoes), .05 (Dresses), .10 (Hats), .15 (Pants)
</code>

Jednak staram się, aby wyglądało to tak:

<code>.05 (Shirts, Shoes, Dresses), .10 (Hats), .15 (Pants)
</code>

Próbowałem go kilka razy z STUFF, ale nigdy nie osiągnąłem rezultatu, którego szukam.

Co prowadzi mnie do pytania, czy jest to możliwe w MsSQL 2008 R2? Jeśli tak, wszelka pomoc w uzyskaniu wyniku, którego szukam, byłaby bardzo mile widziana.

Dziękuję bardzo za czas i energię,

Andrzej

Twoja odpowiedź

2   odpowiedź
3

aby uzyskać schemat i dane. :-) Jeśli podłączysz to do swojego zapytania o gist, powinieneś zobaczyć wyniki, których szukasz (cóż, bardzo blisko - patrz poniżej).

<code>DECLARE @SalesRepID INT, @SurgeonID INT, @LocationID INT;
SELECT @SalesRepID = 2, @SurgeonID = 1, @LocationID = 1;

;WITH x AS 
(
  SELECT CommissionPercent, Categories = STUFF((SELECT ', ' 
      + tCat.Category FROM #tCategories AS tCat 
      INNER JOIN #tCommissions AS tCom 
      ON tCat.CategoryID = tCom.CategoryID
      WHERE tCom.CommissionPercent = com.CommissionPercent
      FOR XML PATH, TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') 
 FROM #tCommissions AS com
 WHERE SalesRepID = @SalesRepID
 AND SurgeonID = @SurgeonID
 AND LocationID = @LocationID
),
y AS
(
  SELECT s = RTRIM(CommissionPercent) + ' (' + Categories + ')' 
  FROM x GROUP BY CommissionPercent, Categories
)
SELECT Result = STUFF((SELECT ', ' + s FROM y 
  FOR XML PATH, TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '');
</code>

Wynik jest nieco inny niż żądałeś, ale możesz to naprawić, stosując ciąg formatowania podczas ciągnięcia CommissionPercent.

<code>Result
--------------------------------------------------------
0.05 (Shirts, Shoes, Dresses), 0.10 (Hats), 0.15 (Pants)
</code>
Tak, nadal uważam, że CLR jest zablokowany przez dwie rzeczy: (a) spiczastych szefów, którzy myślą, że jest to niebezpieczne, oraz (b) bardzo prawdziwą złożoność wdrażania kodu. Nie tylko początkowo, ale kiedy trzeba wprowadzić zmiany, może to być bardzo żmudne ćwiczenie ... Aaron Bertrand
@AaronBertrand Jestem zdumiona, że ​​tak szybko dostałem odpowiedź na tę zagadkę. Udało mi się przenieść to do funkcji z tylko jedną małą korektą (musiałem przesunąć logikę, którą widzętutaj). Będę musiał iść do domu i studiować to trochę więcej, aby zobaczyć conaprawdę dalej, ale jeszcze raz dziękuję za szybką odpowiedź. ajtatum
Jeśli ktoś jest tylko umiarkowanie wykwalifikowany w .NET i ma tylko umiarkowane umiejętności w zakresie T-SQL, jakie rozwiązanie, twoim zdaniem, będzie wymagało więcej wysiłku? Bądź szczery. Aaron Bertrand
Myślę, że to zależy od zmian, które należy wprowadzić. Chopin
0

wiązanie tego problemu (bez użycia kursorów) jest utworzenie funkcji agregującej CLR. Oto przykład w C # (i w VB):http://technet.microsoft.com/en-us/library/ms131056(v=SQL.90).aspx

Wierzę, że to właśnie robi to, czego potrzebujesz: konkatenacja.

Łącząc swój przykład i CLR, aby osiągnąć to, co chcesz - SQL wyglądałby tak:

<code>SELECT
  c.CommissionPercent
  , dbo.MyAgg(cat.Category)
FROM #tCommissions AS c
JOIN #tCategories AS cat ON c.CategoryID = cat.CategoryID
group by c.CommissionPercent
</code>
Dziękuję za szybką odpowiedź. Chociaż nie było to rozwiązanie, z którym się spotkałem, dziękuję za pokazanie mi czegoś nowego. Nie zdawałem sobie nawet sprawy z tej możliwości. ajtatum

Powiązane pytania