Pergunta sobre sql-server, sql-server-2008, tsql, coalesce – Concatenar várias linhas de várias tabelas

2

Eu revimuitos de outros posts aqui e se tornaram bastante familiarizados com a função Coalesce, mas eu não fui capaz de descobrir como fazer essa tarefa específica.

Então, eu tenho uma tabela de comissões e uma tabela de categorias. Eu criei umgist aqui para que você possa ver a estrutura de dados exata com alguns dados de exemplo. Basicamente, a tabela Commission possui uma coluna SalesRepID, LocationID, CategoryID, SurgeonID e CommissionPercent.

Usando uma função CoalesceConsegui obter algo assim passando o SalesRepID, LocationID e SurgeonID:

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

No entanto, estou tentando fazer com que pareça:

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

Eu tentei algumas vezes com o STUFF, mas nunca consegui o resultado que estou procurando.

O que me leva a perguntar se isso é possível no MsSQL 2008 R2? Se for, qualquer ajuda para obter o resultado que estou procurando seria muito apreciada.

Muito obrigado pelo seu tempo e energia,

Andrew

Sua resposta

2   a resposta
0

ver isso (sem usar cursores) é criando uma função agregada CLR. Aqui está um exemplo em C # (e em VB):http://technet.microsoft.com/en-us/library/ms131056(v=SQL.90).aspx

Eu acredito que apenas faz o que você precisa: concatenação.

Combinando o seu exemplo e o CLR, para conseguir o que você quer - o SQL se pareceria com:

<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>
Obrigado pela sua resposta rápida. Embora essa não tenha sido a solução com a qual fui, agradeço por me mostrar algo novo. Eu nem estava ciente dessa possibilidade. ajtatum
3

esquemas e dados. :-) Se você conectar isso à sua consulta, você verá os resultados que deseja (bem, muito próximos - veja abaixo).

<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>

O resultado é um pouco diferente do que você pediu, mas você pode consertar isso aplicando a formatação de string ao extrair o CommissionPercent.

<code>Result
--------------------------------------------------------
0.05 (Shirts, Shoes, Dresses), 0.10 (Hats), 0.15 (Pants)
</code>
Eu acho que isso depende das mudanças a serem feitas. Chopin
Se alguém é apenas moderadamente habilitado em .NET e apenas moderadamente qualificado em T-SQL, qual solução você acha que seria mais um esforço para manter? Seja honesto. Aaron Bertrand
@AaronBertrand também concorda com isso! e sim, minha opinião poderia ser um pouco subjetiva pelo meu background em .NET, mas também tenha em mente, se alguém que não é tão habilidoso quanto você precisa ajustar essa consulta, pode se tornar uma dor de cabeça! Chopin
Sim, eu ainda estou achando que o CLR é bloqueado por duas coisas: (a) chefes de cabelos pontudos achando que é perigoso, e (b) a complexidade muito real na implementação de código. Não apenas inicialmente, mas quando você precisa fazer mudanças, pode se tornar um exercício muito tedioso ... Aaron Bertrand

Perguntas relacionadas