Pregunta sobre coalesce, sql-server, tsql, sql-server-2008 – Concatenar múltiples filas de varias tablas

2

He revisadomuchos otro las publicaciones aquí y me he familiarizado bastante con la función Coalesce, pero no he podido averiguar cómo hacer esta tarea específica.

Entonces, tengo una tabla de Comisiones y una tabla de Categorías. He creado ungist aquí para que pueda ver la estructura de datos exacta con algunos datos de ejemplo. Básicamente, la tabla de la Comisión tiene una columna SalesRepID, LocationID, CategoryID, SurgeonID y CommissionPercent.

Usando una función coalesce, He podido obtener algo como esto al pasar SalesRepID, LocationID y SurgeonID:

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

Sin embargo, estoy tratando de hacer que se vea como:

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

Lo intenté varias veces con STUFF, pero nunca obtuve el resultado que buscaba.

¿Qué me lleva a preguntar si esto es posible incluso en MsSQL 2008 R2? Si es así, cualquier ayuda para obtener el resultado que estoy buscando sería muy apreciada.

Muchas gracias por tu tiempo y energía,

Andrés

Tu respuesta

2   la respuesta
3

¡Gracias por la esencia! Mucho mejor que tirar los dientes para obtener un esquema y datos. :-) Si conecta esto a su consulta global, debería ver los resultados que está buscando (bueno, muy cerca, ver más abajo).

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

El resultado es ligeramente diferente al que solicitó, pero puede solucionarlo aplicando el formato de cadena al extraer CommissionPercent.

<code>Result
--------------------------------------------------------
0.05 (Shirts, Shoes, Dresses), 0.10 (Hats), 0.15 (Pants)
</code>
Creo que eso depende de los cambios a realizar. Chopin
Si alguien tiene una habilidad moderada en .NET y una habilidad moderada en T-SQL, ¿qué solución crees que sería más esfuerzo mantener? Se honesto. Aaron Bertrand
@AaronBertrand está de acuerdo con eso también! y sí, mi opinión podría ser un poco subjetiva por mi experiencia en .NET, pero también tenga en cuenta que si alguien que no es tan hábil como usted necesita modificar esa consulta, ¡podría convertirse en un dolor de cabeza! Chopin
@AaronBertrand Me sorprende que obtuve la respuesta a este rompecabezas tan rápido. Pude mover esto a una función con solo un pequeño ajuste (tuve que mover el lugar donde la lógica veaquí). Tendré que ir a casa y estudiar esto un poco más para ver cuál esDe Verdad continuando, pero gracias de nuevo por su pronta respuesta. ajtatum
0

Me topé con un problema similar antes, y la única forma en que podría resolverlo (sin usar cursores), es mediante la creación de una función agregada CLR. Aquí hay un ejemplo en C # (y en VB):http://technet.microsoft.com/en-us/library/ms131056(v=SQL.90).aspx

Creo que solo hace lo que necesitas: concatenación.

Combinando su ejemplo y el CLR, para lograr lo que desea, el SQL se vería así:

<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>
Gracias por tu pronta respuesta. Si bien esta no fue la solución con la que fui, le agradezco que me muestre algo nuevo. Ni siquiera era consciente de esa posibilidad. ajtatum

Preguntas relacionadas