Pregunta

después de una consulta sql muy larga, se obtiene un resultado de esta forma:

 col1 | col2 | col3 | col4
------+------+------+-----
1234  | 1    | aaaa | bbbb
2378  | 0    | aaaa | bbbb
9753  | 1    | cccc | uuuu
1234  | 0    | iiii | yyyy
2378  | 1    | iiii | yyyy
9753  | 1    | tttt | mmmm

pero no lo necesito de esta manera. Tengo que hacer otra declaración SQL sobre este resultado donde tengo que usar group by en la tercera y cuarta columna. en otras palabras, dos filas en una, así:

col1 | col2 | col3 | col4 | col5 | col6
-----+------+------+------+------+-----
1234 | 1    | 2378 | 0    | aaaa | bbbb
1234 | 1    | 2378 | 0    | aaaa | bbbb
9753 | 1    | null | null | cccc | uuuu
1234 | 0    | 2378 | 1    | iiii | yyyy
9753 | 1    | null | null | tttt | mmmm
¿Fue útil?

Solución

Puede resolver ese problema haciendo dos tablas adicionales (temporales o no, depende de sus requisitos y del motor SQL) cuya estructura asignará las columnas de la consulta.

Por ejemplo:

CREATE TABLE TableA (
  Col1 int,
  Col2 bit,
  Col3 varchar(4),
  Col4 varchar(4)
)

CREATE TABLE TableB (
  Col1 int,
  Col2 bit,
  Col3 varchar(4),
  Col4 varchar(4)
)

Tenga en cuenta que esta es solo una estructura de ejemplo basada en los datos de salida que ha presentado.

Después de hacer esas dos tablas, tendría que insertar datos de la consulta en cada una de las tablas.

Agregado: No tiene que ejecutar la misma consulta dos veces. Ejecútelo una vez, coloque los datos en la Tabla A, luego haga SELECCIONAR en la Tabla A y coloque los datos en la Tabla B. Eso te ahorrará mucho tiempo.

El último paso sería realizar una consulta en TableA y TableB con JOIN en sus columnas Col3 y Col4. Algo como esto:

SELECT A.Col1, A.Col2, B.Col1, B.Col2, COALESCE(A.Col3, B.Col3), COALESCE(A.Col4, B.Col4)  
FROM TableA A INNER JOIN TableB B ON A.Col3 = B.Col3 AND A.Col4 = B.Col4

Espero que esto ayude.

También tenga en cuenta que esta solución tiene un inconveniente importante:

Si cambia el número de columnas o su tipo de datos en la consulta original, también deberá actualizar las definiciones de la tabla. Una posible solución a esto sería usar un sql dinámico, pero generalmente no se aconseja.

Después de editar (ha proporcionado NULLS adicionales en los datos de salida):

Si desea mantener valores NULL, debe usar una combinación diferente, por ejemplo: LEFT OUTER JOIN

Otras posibles soluciones son:

  1. Simplemente reemplace (SELECT * FROM dbo.Test) con su consulta larga. Sin embargo, esto hará que la consulta se ejecute dos veces.

    SELECCIONE A. *, B. * DESDE (SELECCIONAR * DESDE dbo.Test) A IZQUIERDA EXTERIOR UNIRSE (SELECCIONAR * DESDE dbo.Test) B EN A.Col3 = B.Col3 Y A.Col4 = B.Col4 Y A.Col1 & Lt; & Gt; B.Col1 Y A.Col2 & Lt; & Gt; B.Col2

  2. Si usa SQL 2005, podría intentar usar el operador CROSS APPLY.

Puede haber otras soluciones, pero debe ser más descriptivo sobre el motor SQL que usa y sus derechos en la base de datos.

Otros consejos

Hmm,

Tiraría el resultado en una tabla temporal. Entonces haz

select 
a.col1, 
a.col2, 
b.col1,
b.col2,
coalesce(a.col3, b.col3) as col5, 
coalesce(a.col4,b.col4) as col6 
from #tmp a 
outer join #tmp b 
on a.col3 = b.col3 and a.col4 = b.col4 
where a.col2 = 0 and b.col2 = 1

Esto, por supuesto, supone que el col2 es un indicador de qué parte del par tiene.

Encontré la solución correcta, basada en la primera solución de @Wodzu .

en primer lugar, cree una vista temporal que contendrá el resultado.

con tmp como ( --mi declaración sql muy larga ... )

en segundo lugar, haga la selección ya que hay dos de ellos, de esta forma la consulta se llama solo una vez.

seleccione a. **, b. ** de tmp a unión interna tmp b en condiciones.

Gracias Wodzu

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top