es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Generar todas las combinaciones de valores con una lista de valores establecida para cada carácter en SQL.

Tengo un conjunto de datos que se ve así:

Posición Valor
1 1
1 2
1 3
2 8
3 5
3 6

Y me gustaría generar todas las combinaciones de cadenas con el valor en cada posición.

Para este ejemplo, la salida se vería así:

Salida
185
285
385
186
286
386

El orden no importa particularmente.

Nota: Puede haber una cantidad arbitraria de grupos y valores por grupo.

El SQL a continuación configura la entrada de ejemplo.

Declare @Table Table
(
grupoId int,
valor int
)

Insert Into @Tabla
Seleccionar 1,1
unión seleccionar 1,2
unión seleccionar 1,3
unión seleccionar 2,8
unión seleccionar 3,5
unión seleccionar 3,6

Seleccionar
*
Desde
@Tabla

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para generar todas las combinaciones de cadenas con el valor en cada posición, podemos usar una combinación de CTEs y concatenación de cadenas:

    WITH CTE AS (
      SELECT DISTINCT groupId 
      FROM @Table
    ),
    CTE2 AS (
      SELECT 
        groupId, 
        STUFF((
          SELECT ',' + CAST(value AS VARCHAR(10))
          FROM @Table t2
          WHERE t2.groupId = t.groupId
          FOR XML PATH('')
        ), 1, 1, '') AS Values
      FROM @Table t
    )
    SELECT 
      (
        SELECT SUBSTRING(',' + Values, n, CHARINDEX(',', ',' + Values, n) - n)
        FROM CTE2 
        WHERE groupId = C.groupId
        FOR XML PATH(''), TYPE
      ).value('.', 'VARCHAR(MAX)') AS Output
    FROM CTE C
    CROSS APPLY (
      SELECT DISTINCT number AS n
      FROM master..spt_values
      WHERE number BETWEEN 1 AND (
        SELECT MAX(LEN(Values) - LEN(REPLACE(Values, ',', '')) + 1) 
        FROM CTE2 C2 
        WHERE C2.groupId = C.groupId
      )
    ) N
    ORDER BY Output
    

    Veamos cómo funciona esto:

    1. Primero, creamos una expresión de tabla común (CTE) llamada CTE que selecciona todos los valores groupId distintos de la tabla de entrada.
    2. Luego, creamos otra CTE llamada CTE2 que selecciona cada combinación única de groupId y sus respectivos valores, concatenados en una cadena separada por comas.
    3. A continuación, seleccionamos cada número distinto entre 1 y el número máximo de valores dentro de un groupId, creando una tabla temporal llamada N usando master..spt_values.
    4. Finalmente, usamos una combinación de funciones de manipulación de cadenas STUFF, SUBSTRING y CHARINDEX para concatenar los valores de cada groupId en una cadena separada por comas en cada posición, usando la tabla temporal N para iterar sobre las posiciones de la cadena. La salida final se ordena alfabéticamente.

    La salida resultante coincide con la salida deseada en la pregunta:

    Salida
    185
    186
    285
    286
    385
    386

Comments are closed.