Gostaria de saber se alguém pode me ajudar com o código abaixo. Vou explicar: eu preciso listar, na mesma linha de registros, várias informações que normalmente sairiam como linhas, em colunas.
Por exemplo:
ID NOME
15 LEONARDO
1659 RAFAEL
15984 DONATELLO
54216 MICHELANGELO
Tenho um select beeeem grande que precisaria retornar, na linha, essas colunas (apenas o nome), como o exemplo abaixo:
IDSERVICO NOME1 NOME2 NOME3 NOME4
45 LEONARDO RAFAEL DONATELLO MICHELANGELO
Se fosse no PostgreSQL, eu faria subqueries usando LIMIT (TOP) e OFFSET e encaixaria como uma luva. Mas o SQL Server não tem esse recurso, então tive que apelar para um workaround :x
Estou realizando a seguinte subquery, 6 vezes:
(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 1)
(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 2)
(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 3)
(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 4)
(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 5)
(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 6)
Sendo que PRC.ID é uma tabela que está fora das subqueries, realizando o vínculo entre os registros.
Essa view tem o seguinte código:
SELECT ROWNR, RAZAOSOCIAL, ID FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY PRC.ID ORDER BY PAR.ID_PARTE ASC) AS ROWNR,
TER.NOME,
PAR.ID
FROM PARTES PAR WITH (NOLOCK)
INNER JOIN TERCEIROSX TER WITH (NOLOCK) ON TER.NTERC = PAR.NTERC
INNER JOIN PRINCIPAL PRC WITH (NOLOCK) ON PAR.ID = PRC.ID
WHERE
PAR.IDADV_PARTETIPO = 1
) RESULT
Agora usando o OVER(PARTITION ...) está funcionando, mas está usando muitos recursos do servidor. O problema é que o PARTITION cria uma numeração de linha para cada processo, ou seja:
ROWNR ID NOME
1 45 XXX
2 45 YYY
3 45 ZZZ
1 485 KKKKKKK
2 485 RSRSRSRS
1 644 MIMIMIMI
e por ai vai.
Sem o PARTITION ficaria assim:
ROWNR ID NOME
1 45 XXX
2 45 YYY
3 45 ZZZ
4 485 KKKKKKK
5 485 RSRSRSRS
6 644 MIMIMIMI
Ele segue a contagem normal. O problema é que, com a subquery que passei acima, não a ROWNR 2 para o ID 485, e sim a ROWNR 5.
Já consegui fazer isso anteriormente, a mais de um mês, mas não lembro como fiz :o
Pergunta
Xistyle
E ai pessoal?
Tudo bem?
Gostaria de saber se alguém pode me ajudar com o código abaixo. Vou explicar: eu preciso listar, na mesma linha de registros, várias informações que normalmente sairiam como linhas, em colunas.
Por exemplo:
ID NOME
15 LEONARDO
1659 RAFAEL
15984 DONATELLO
54216 MICHELANGELO
Tenho um select beeeem grande que precisaria retornar, na linha, essas colunas (apenas o nome), como o exemplo abaixo:
IDSERVICO NOME1 NOME2 NOME3 NOME4
45 LEONARDO RAFAEL DONATELLO MICHELANGELO
Se fosse no PostgreSQL, eu faria subqueries usando LIMIT (TOP) e OFFSET e encaixaria como uma luva. Mas o SQL Server não tem esse recurso, então tive que apelar para um workaround :x
Estou realizando a seguinte subquery, 6 vezes:
(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 1)
(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 2)
(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 3)
(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 4)
(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 5)
(SELECT TOP 1 RAZAOSOCIAL FROM VW_PARTES WHERE ID = PRC.ID AND ROWNR = 6)
Sendo que PRC.ID é uma tabela que está fora das subqueries, realizando o vínculo entre os registros.
Essa view tem o seguinte código:
Agora usando o OVER(PARTITION ...) está funcionando, mas está usando muitos recursos do servidor. O problema é que o PARTITION cria uma numeração de linha para cada processo, ou seja:
ROWNR ID NOME
1 45 XXX
2 45 YYY
3 45 ZZZ
1 485 KKKKKKK
2 485 RSRSRSRS
1 644 MIMIMIMI
e por ai vai.
Sem o PARTITION ficaria assim:
ROWNR ID NOME
1 45 XXX
2 45 YYY
3 45 ZZZ
4 485 KKKKKKK
5 485 RSRSRSRS
6 644 MIMIMIMI
Ele segue a contagem normal. O problema é que, com a subquery que passei acima, não a ROWNR 2 para o ID 485, e sim a ROWNR 5.
Já consegui fazer isso anteriormente, a mais de um mês, mas não lembro como fiz :o
Alguma sugestão?
Editado por XistyleLink para o comentário
Compartilhar em outros sites
2 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.