- Este tópico contém 9 respostas, 4 vozes e foi atualizado pela última vez 14 anos, 9 meses atrás por
Ishii.
-
AutorPosts
-
10 de junho de 2011 às 12:17 am #99571
augustoca
ParticipanteE aew pessoal,
Alguém conhece alguma alternativa capaz de duplicar uma linha. Hoje esta assim:
ID Imposto 5% Imposto 10%
1 100 250
2 150 300
3 0 450
4 45 0O que eu preciso é aplicar alguma solução para isso virar isso:
ID Imposto 5% Imposto 10%
1 100 0
1 0 250
2 150 0
2 0 300
3 0 450
4 45 0o sql que estou trabalhando esta feio alterar a maneira que ele esta é pior. a melhor forma de resolver e assim, alguem pode me ajudar?
att,
Augusto
10 de junho de 2011 às 12:34 am #99572rman
ParticipanteFiz uns testes aqui, e consegui chegar no resultado esperado.
Só achei um pouco estranho, ID não é PK ??? Se for, não será possível fazer o que você quer…
CREATE TABLE IMPOSTO (
ID NUMBER
,IMPOSTO5 NUMBER
,IMPOSTO10 NUMBER
);INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(1,100,250);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(2,150,300);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(3,0,450);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(4,45,0);COMMIT;
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10)
SELECT ID,IMPOSTO5,0
FROM IMPOSTO
WHERE IMPOSTO5 0
AND IMPOSTO10 0;INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10)
SELECT ID,0,IMPOSTO10
FROM IMPOSTO
WHERE IMPOSTO5 0
AND IMPOSTO10 0;DELETE
FROM IMPOSTO
WHERE IMPOSTO5 0
AND IMPOSTO10 0;COMMIT;
SELECT *
FROM IMPOSTO
ORDER BY ID;
10 de junho de 2011 às 12:54 am #99573augustoca
ParticipanteEntenti sua solução. Mas isso que te passei é só uma demonstração. Minha tabela tem mais de 50k de registros e preciso fazer um select onde o retorno seja esse aí, retornando 2 linhas para uma mesma linha quando existem dois tipos de impostos …
o campo ID é primary key…
[quote=”rman”:y1q9cmtg]Fiz uns testes aqui, e consegui chegar no resultado esperado.
Só achei um pouco estranho, ID não é PK ??? Se for, não será possível fazer o que você quer…
CREATE TABLE IMPOSTO (
ID NUMBER
,IMPOSTO5 NUMBER
,IMPOSTO10 NUMBER
);INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(1,100,250);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(2,150,300);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(3,0,450);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(4,45,0);COMMIT;
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10)
SELECT ID,IMPOSTO5,0
FROM IMPOSTO
WHERE IMPOSTO5 0
AND IMPOSTO10 0;INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10)
SELECT ID,0,IMPOSTO10
FROM IMPOSTO
WHERE IMPOSTO5 0
AND IMPOSTO10 0;DELETE
FROM IMPOSTO
WHERE IMPOSTO5 0
AND IMPOSTO10 0;COMMIT;
SELECT *
FROM IMPOSTO
ORDER BY ID;
[/quote]10 de junho de 2011 às 12:59 am #99574rman
ParticipanteEntão você não quer mudar a forma que os registros estão armazenados (em 1 linha), você apenas apresenta los de forma diferente né (1 linha por imposto) ?
Segue uma solução usando “UNION ALL”
CREATE TABLE IMPOSTO (
ID NUMBER
,IMPOSTO5 NUMBER
,IMPOSTO10 NUMBER
);INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(1,100,250);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(2,150,300);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(3,0,450);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(4,45,0);COMMIT;
SELECT X.ID,X.IMPOSTO5,0 IMPOSTO10
FROM IMPOSTO X
WHERE X.IMPOSTO5 0
UNION ALL
SELECT Y.ID,0,Y.IMPOSTO10
FROM IMPOSTO Y
WHERE Y.IMPOSTO10 0
ORDER BY ID;
10 de junho de 2011 às 2:18 am #99575rman
ParticipanteAcabei de encontrar um bug no forum, não é possível postar uma frase que contenha a palavra “UNION” …
Só consegui postar mascarando o “UNION” com as aspas… Nem dentro da tag code é possível 😯
10 de junho de 2011 às 4:44 pm #99577leandrolbs
Participanteunion
UNIONupdate1
normal rman;
10 de junho de 2011 às 6:07 pm #99578augustoca
Participante[quote=”rman”:d9o2pfjq]Então você não quer mudar a forma que os registros estão armazenados (em 1 linha), você apenas apresenta los de forma diferente né (1 linha por imposto) ?
Segue uma solução usando “UNION ALL”
CREATE TABLE IMPOSTO (
ID NUMBER
,IMPOSTO5 NUMBER
,IMPOSTO10 NUMBER
);INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(1,100,250);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(2,150,300);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(3,0,450);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(4,45,0);COMMIT;
SELECT X.ID,X.IMPOSTO5,0 IMPOSTO10
FROM IMPOSTO X
WHERE X.IMPOSTO5 0
UNION ALL
SELECT Y.ID,0,Y.IMPOSTO10
FROM IMPOSTO Y
WHERE Y.IMPOSTO10 0
ORDER BY ID;
[/quote]Opa…é assim vai resolver, mas isso para 50k de registros sera que vale a pena? Será que não existe função analítica para isso?
10 de junho de 2011 às 8:13 pm #99580rman
Participante[quote=”augustoca”:x9kua9sa][quote=”rman”:x9kua9sa]Então você não quer mudar a forma que os registros estão armazenados (em 1 linha), você apenas apresenta los de forma diferente né (1 linha por imposto) ?
Segue uma solução usando “UNION ALL”
CREATE TABLE IMPOSTO (
ID NUMBER
,IMPOSTO5 NUMBER
,IMPOSTO10 NUMBER
);INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(1,100,250);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(2,150,300);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(3,0,450);
INSERT INTO IMPOSTO(ID,IMPOSTO5,IMPOSTO10) VALUES(4,45,0);COMMIT;
SELECT X.ID,X.IMPOSTO5,0 IMPOSTO10
FROM IMPOSTO X
WHERE X.IMPOSTO5 0
UNION ALL
SELECT Y.ID,0,Y.IMPOSTO10
FROM IMPOSTO Y
WHERE Y.IMPOSTO10 0
ORDER BY ID;
[/quote]Opa…é assim vai resolver, mas isso para 50k de registros sera que vale a pena? Será que não existe função analítica para isso?[/quote]
Creio que vai ficar rapido, executa o plano desta query e posta para nós analisarmos…
10 de junho de 2011 às 8:16 pm #99581rman
Participante[quote=”leandrolbs”:ob58fnb1]union
UNIONupdate1
normal rman;[/quote]
Tenta postar isso: Testando a palavra “UNION” no meio da frase, sem as aspas…
Se tiver no meio da frase da o bug, a palavra “UNION” isolada passa…
10 de junho de 2011 às 8:26 pm #99583Ishii
ParticipanteOlá,
Sim no meio da frase da um bug mesmo, ele volta para o home…
Acho que o MySql tenta montar o union….
[]s Ishii
-
AutorPosts
- Você deve fazer login para responder a este tópico.