Ir para conteúdo
Fórum Script Brasil

Kakao

Membros
  • Total de itens

    463
  • Registro em

  • Última visita

Tudo que Kakao postou

  1. É apenas um nível de parentesis para cada linha: INSERT INTO chassott_notas (nota, data, fornecedor_id, valor) VALUES (4802, '01-10-2012', 23, 1726.04) Se fossem duas linhas: INSERT INTO chassott_notas (nota, data, fornecedor_id, valor) VALUES (4802, '01-10-2012', 23, 1726.04), (4803, '02-10-2012', 2, 1.04) Repare na vírgula entre as duas linhas de valores. Mas o formato de data provavelmente está errado. Se der problema tente este formato: '2012-10-01'
  2. Testei com esta tabela: create table estoque (data date, operacao varchar(2), valor money); insert into estoque (data, operacao, valor) values ('2012-01-01', 'C', 100), ('2012-01-01', 'V', 90), ('2012-01-03', 'DV', 20), ('2012-01-03', 'DC', 30), ('2012-01-05', 'V', 10), ('2012-01-05', 'C', 100), ('2012-01-06', 'DC', 120), ('2012-01-06', 'C', 10); A consulta: select data, aumento, diminuicao, variacao_liquida, coalesce(saldo_anterior, 0::money) + variacao_liquida saldo_atual from ( select data, sum(case when operacao in ('C', 'DV') then valor else 0::money end) aumento, sum(case when operacao in ('V', 'DC') then valor * -1 else 0::money end) diminuicao, sum(case when operacao in ('C', 'DV') then valor else valor * -1 end) variacao_liquida, ( select sum(case when operacao in ('C', 'DV') then valor else valor * -1 end) from estoque e where data < estoque.data ) saldo_anterior from estoque group by data ) s order by data ; data | aumento | diminuicao | variacao_liquida | saldo_atual ------------+---------+------------+------------------+------------- 2012-01-01 | $100.00 | -$90.00 | $10.00 | $10.00 2012-01-03 | $20.00 | -$30.00 | -$10.00 | $0.00 2012-01-05 | $100.00 | -$10.00 | $90.00 | $90.00 2012-01-06 | $10.00 | -$120.00 | -$110.00 | -$20.00 Para tabelas maiores vai ficar lento. Solução: Migrar para 9.2.
  3. Esta consulta mostra a variação liquida de cada dia o que não é o saldo. É o saldo diário que você precisa? Se for seria muito mais fácil em uma versão mais nova. O 8.2 já não tem mais suporte. select data, sum(C + DV) aumento, sum(V + DC) diminuicao, sum(C + DV - V - DC) variacao_liquida from t group by data order by data
  4. Achei o problema. Em versões mais antigas tem que escapar a barra invertida, colocando '\\s+' ao invés de '\s+': SELECT * FROM PCCDAPL0 WHERE UPPER(APLICA) LIKE ALL (STRING_TO_ARRAY( '%' || REGEXP_REPLACE(UPPER('CABO FREIO'), '\\s+', '% %', 'g') || '%', ' ')) ;
  5. Eu pesquisei 'cabo freio' e retornou a linha. Não tem que mudar nada na consulta. drop table PCCDAPL0; create table PCCDAPL0 (APLICA text); insert into PCCDAPL0 values ('CABO DE FREIO TRASEIRO'), ('FLEXIVEL DE FREIO'), ('ALAVANCA DE ACIONAMENTO DO FREIO PELO PE'), ('MOLA INTERRUPTOR DE FREIO, PEDAL DE FREIO E ALAVANCA DE FREIO CARGO 200 ZH. KIT COM AS 3.'); SELECT * FROM PCCDAPL0 WHERE UPPER(APLICA) LIKE ALL (STRING_TO_ARRAY( '%' || REGEXP_REPLACE(UPPER('CABO FREIO'), '\s+', '% %', 'g') || '%', ' ')) ; aplica ------------------------ CABO DE FREIO TRASEIRO
  6. Só um deles tem as duas palavras cabo e freio. Eu entendi que você queria que voltasse só aqueles que tivessem todas as palavras. Foi a primeira coisa que perguntei. A consulta que eu postei só retorna aquelas descrições que contenham todas as palavras pesquisadas. Confirme se é isso mesmo ou se você quer que volte aqueles que tenham pelo menos uma das palavras pesquisadas.
  7. Qual é o valor de APLICA nestes 4 registros para eu poder testar aqui? Eu testei com o valor 'cabo freio' e funcionou (retornou as linhas). Testei assim: drop table PCCDAPL0; create table PCCDAPL0 (APLICA text); insert into PCCDAPL0 values ('cabo freio'), ('cabo grande do freio'), ('cabo freio corsa'), ('conjunt de cabo do freio'), ('ACELERADOR CABO CARRO GOL'), ('FREIO CARRO GOL'), ('acelerador cabo gol'); SELECT * FROM PCCDAPL0 WHERE UPPER(APLICA) LIKE ALL (STRING_TO_ARRAY( '%' || REGEXP_REPLACE(UPPER('CABO FREIO'), '\s+', '% %', 'g') || '%', ' ')) ; aplica -------------------------- cabo freio cabo grande do freio cabo freio corsa conjunt de cabo do freio (4 rows)
  8. Testei com esta tabela: create table ts (descricao text); insert into ts values ('ACELERADOR CABO CARRO GOL'), ('FREIO CARRO GOL'), ('acelerador cabo gol'); Substitua 'CABO ACELERADOR GOL' pelos termos procurados: select * from ts where lower(descricao) like all (string_to_array( '%' || regexp_replace(lower('CABO ACELERADOR GOL'), '\s+', '% %', 'g') || '%', ' ')); descricao --------------------------- ACELERADOR CABO CARRO GOL acelerador cabo gol Para algo mais sofisticado tem que usar os tipos, funções e operadores de text search.
  9. A consulta precisa retornar as descrições que tenham todas as palavras da frase ou basta uma delas? Qual é a versão do postgresql? Vou tentar responder amanhã. Por enquanto você pode dar uma pesquisada em "text search". No manual (inglês): http://www.postgresql.org/docs/current/sta...textsearch.html http://www.postgresql.org/docs/current/sta...textsearch.html
  10. Eu destacaria no Postgresql o excelente nível do suporte gratuito na net. Além é óbvio da licença similar ao BSD (pode tudo). Há mais similaridades do que diferenças entre os dois mas para conhecer bem são necessários muita pesquisa e experiência em bancos de dados. Não tenho experiência com o Oracle. Tenho bastante com Postgresql e SQL Server e não muita com MySQL. Dentre estes últimos o Postgresql é sem dúvida o lider na tecnologia de banco de dados. Vindo em seguida um pouco distante o SQL Server e por último muito distante o MySQL. Já li algumas vezes comentários por parte de quem tem experiência com Oracle e Postgresql que os dois seriam equivalentes e que o Postgresql teria até algumas características superiores. Este tipo de discussão sempre gera desconfianças e não é muito construtiva então é melhor não ficar provocando muito por aí :unsure:
  11. Kakao

    Criar um Script

    set @pedido := 'PP-00024295/12'; update vendadet set natureza = 5.403 where sittrib = 010 and numero = @pedido; update vendadet set natureza = 5.102 where sittrib = 020 and numero = @pedido; update vendadet set natureza = 5.405 where sittrib = 060 and numero = @pedido; update vendadet set icms = 17 where sittrib = 020 and numero = @pedido; update vendadet set reducaobase = 41.1760 where sittrib = 020 and numero = @pedido;
  12. Qual é o tipo da coluna icms? Admite nulo? Você pode tentar setar nulo: update estoque set icms = null where tributaria = 060
  13. Use ponto ao invés de vírgula: update vendadet set reducaobase = 41.1760
  14. No 8.2 tem que usar sequência: begin; drop sequence if exists s; create temporary sequence s; select setval('s', (select max(cast(codigo as integer)) m from ts)); update ts set codigo = i from ( select codigo, grid, nextval('s') i from ( select codigo, max(grid) grid from ts group by codigo having count(*) > 1 order by grid ) q ) s where ts.codigo = s.codigo and ts.grid = s.grid ; Se sobrarem duplicados repita só do update para baixo. Depois é só dar rollback ou commit conforme o caso e opcionalmente dar o drop na sequência que é temporária e vai cair de qualquer modo ao fim da sessão. Enquanto não der commit o update não está valendo.
  15. with dup as ( select codigo, max(grid) grid from ts group by codigo having count(*) > 1 ), m as ( select max(cast(codigo as integer)) m from ts ) update ts set codigo = i from ( select codigo, grid, row_number() over(order by grid) + (select m from m) i from dup ) s where ts.codigo = s.codigo and ts.grid = s.grid Este update supõe que só existem duplicados e não triplicados ou mais. Se existirem é só repetir o update até não existir mais nenhum duplicado. Para não correr risco (mesmo se houver backup) é melhor dar um *begin;* antes do comando e aí conferir o resultado. Se deu certo dá um *commit;*. Se não deu faz um *rollback;*.
  16. select max(cast(codigo as integer)) from t
  17. select pf.placa, pl.total, array_agg(p.codigo) as codigo from pessoa p inner join pessoa_frota pf on p.grid = pf.pessoa inner join ( select placa, count(*) as total from pessoa_frota group by placa having count(placa) > 1 ) pl on pl.placa = pf.placa group by pf.placa, pl.total order by pf.placa
  18. select pf.placa, pl.total, p.codigo from pessoa p inner join pessoa_frota pf on p.grid = pf.pessoa inner join ( select placa, count(*) as total from pessoa_frota group by placa having count(placa) > 1 ) pl on pl.placa = pf.placa order by p.grid, pl.placa
  19. Uma técnica interessante é reduzir ao máximo a complexidade do problema e uma vez resolvido ir aumentando a complexidade aos poucos. Neste caso comece com uma palavra de tamanho fixo e par, por exemplo 4. Depois faça com tamanho fixo impar e por último com tamanho variável.
  20. coolbee, use a técnica de fatiamento nos exemplos anteriores.
  21. Aí já é um pouco mais difícil (Python 3): def sopa(s, i): print (s) for j in range(i): s = s[1: int(len(s)/2)] + s[0] + s[-1:] + s[int(len(s)/2): -1] print (s) s = "abcdef" i = 2 sopa(s, i)
  22. A dica é o fatiamento (slicing) de strings. Python 2: s = raw_input("String: ") for i in s[:-1]: s = s[1:] + s[0] print s Python 3: s = input("String: ") for i in s[:-1]: s = s[1:] + s[0] print (s)
  23. Mostra o HTML onde está o campo bairro.
  24. A alternativa "E" está errada em qualquer das duas hipóteses a não ser que month não seja 0 como você colocou. Não sei se é possível enquadrar um erro de sintaxe como erro de execução porque no caso do Python a sintaxe é checada antes da execução então não haveria alternativa correta.
×
×
  • Criar Novo...