Pergunta

após um longo sql consulta a ter um resultado que é desta 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

mas eu não precisar dele desta maneira. eu tenho que fazer outra sql-declaração sobre este resultado, onde eu tenho que usar grupo por a terceira e quarta coluna. em outras palavras, duas linhas em um, como este:

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
Foi útil?

Solução

Você pode resolver esse problema fazendo duas tabelas adicionais (temporárias ou não, depende de suas necessidades e motor de SQL) que estrutura será mapear as colunas da consulta.

Por exemplo:

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

Note que este é apenas um exemplo de estrutura com base nos dados de saída que você apresentou.

Depois de fazer essas duas tabelas, você teria que inserir dados de consulta para cada uma das tabelas.

Adicionado: Você não tem que executar a mesma consulta duas vezes. Executar uma vez, colocar os dados à TableA em seguida, fazer SELECT no TableA e colocar dados para o TableB. Que você vai economizar muito tempo.

A última etapa seria perfrom consulta TableA e TableB com juntam-se em suas colunas col3 e Col4. Algo parecido com isto:

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

Esperamos que isto ajude.

Também tenha em mente que esta solução tem um grande problema:

Se você alterar o número de colunas ou o seu tipo de dados na consulta oryginal, você terá que também atualizar as definições de tabela. possível solução para isso seria usar um SQL dinâmico, mas geralmente não é aconselhado.

Depois de editar (você forneceu NULLS adicionais em dados de saída):

Se você quiser manter valores NULL, você deve usar diferentes juntar-se, por exemplo: LEFT OUTER JOIN

Outra soluções possíveis são:

  1. Basta substituir (SELECT * FROM dbo.Test) com sua longa consulta. No entanto, isto fará com que essa consulta será executado duas vezes.

    * seleccionar A., ??B. * DE (SELECT * FROM dbo.Test) LEFT OUTER JOIN (SELECT * FROM dbo.Test) B = NO A.Col3 B.Col3 E A.Col4 = E B.Col4 A.Col1 <> B.Col1 E A.Col2 <> B.Col2

  2. Se você usar SQL 2005 você pode tentar usar operador CROSS APPLY.

Pode haver outras soluções, mas você deve ser mais descritivo sobre motor de SQL que você usa e os seus direitos sobre o banco de dados.

Outras dicas

Hmm,

Eu atirar o resultado em uma tabela temporária. Em seguida, faça

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

Esta é ofcourse assumindo que o col2 é um indicador de que parte do par que você tem.

i encontrou a solução correta, baseada na primeira solução de @Wodzu .

Em primeiro lugar, criar uma exibição temporária que conterá o resultado.

com tmp como ( --Minha muito longa instrução SQL ... )

Em segundo lugar, fazer a escolha, pois há dois deles, nestes maneira a consulta é chamado apenas uma vez.

selecione um. ** b. ** de tmp participar de um interior tmp b em condições.

Graças Wodzu

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top