none
Query não roda, porém não dá erro RRS feed

  • Pergunta

  • Olá, boa tarde.

    Estou tentando rodar uma query que conecta algumas tabelas, para fazer análises de frete da companhia que trabalho.

    Porém, a query não dá ero mas também não termina de rodar nunca. Segue abaixo.

    Alguém tem alguma dica de pq ela não roda? Estou com medo de ter caído em algum looping ou algo do tipo.

    Obs: sou leiga! Nunca trabalhei com SQL antes, é a primeira vez.

    INSERT INTO FretePlanLog (
    Fornecimento,
    ID,
      Emissor,
       Cliente,
        Estado,
           Cidade,
             Macrorregião,
              Divisão,
               NotaFiscal,
                  TipodeNegocioDPPDL,
                    TipodeVeículo,
                     EscritorioVendas,
                      Circuito,
                         Analista,
                           Tracker,
                            Coordenador,
                             G14,
                               NumeroDocumento9posições,
                                 Mês,
                                  CodigoTransportadora,
                                   Transportadora,
                                      CodigoTransportadoraTransferência,
                                        Dtreal,
                                         Ano,
                                          TipoNfCodigo,
                                             SemanaMes,
                                               SemanaAno,
                                                TpDV,
                                                 CIFouFOB,
                                                    PesoBruto,
                                                      TipodeOperação,
                                                       ValorNotaFiscal,
                                                        ValorFreteLíquido,
                                                           ValorFreteSemICMS,
                                                             PesoFracionada,
                                                              PesoDireta,
                                                               PesoMultiparada,
                                                                  PesoCabotagem)


    SELECT 

    Ztmm0106.Fornecimento, 
    Ztmm0106.ZTMM0106_IDCARREG as ID, 
    Ztmm0106.Cliente AS Emissor, 

    KNA1.[Nome1] AS Cliente, 
    KNA1.RG AS Estado, 
    KNA1.Local AS Cidade, 
    DadosGeograficos.Macrorregiao as Macrorregiao,
    Ztmm0106.OrgV as Divisao,
    Base_de_Frete.Nota_Fiscal as NotaFiscal,
    BaseEmissores.TipodeNegocioDPPDL, 
    Ztmm0121.Tipo_de_veiculo as TipodeVeiculo, 
    [BaseEmissores].EscritorioVendas, 
    [BaseEmissores].Circuito, 
    [BaseEmissores].Analista, 
    [BaseEmissores].Tracker, 
    [BaseEmissores].Coordenador, 
    BaseEmissores.G14, 
    Ztmm0106.NumeroDocumento9posicoes as NumeroDocumento9posicoes,
    Month([Ztmm0106].Mes) AS Mes, 
    Ztmm0106.CodigoTransportadora AS CodigoTransportadora, 
    [Ztmm0106].Nome1 AS Transportadora, 
    Ztmm0121.CodigoTransportadoraTransferencia as CodigoTransportadoraTransferencia, 
    [Ztmm0106].Mes as Dtreal, 
    Year([Ztmm0106].Mes) AS Ano, 
    Base_de_Frete.TipoNfCodigo as TipoNfCodigo, 
    [SemanaFornecimento].SemanaMes, 
    [SemanaFornecimento].SemanaAno, 
    Ztmm0106.TpDV, 
    [Ztmm0106].IncTm AS CIFouFOB,
    Base_de_Frete.PesoBruto as PesoBruto, 
    Ztmm0121.TipodeOperacao as TipodeOperacao, 
    Base_de_Frete.ValorNotaFiscal as ValorNotaFiscal, 
    Base_de_Frete.FreteLiquido as FreteLiquido,
    Base_de_Frete.ValorFreteSemICMS as ValorFreteSemICMS, 

    IIf([Ztmm0121].TipodeOperacao ='FRC',[Base_de_Frete].PesoBruto,0) AS [PesoFracionada],
    IIf([Ztmm0121].TipodeOperacao ='DRT',[Base_de_Frete].PesoBruto,0) AS [PesoDireta],
    IIf([Ztmm0121].Tipo_de_veiculo ='Q',[Base_de_Frete].PesoBruto,0) AS [PesoMultiparada],
    IIf([Ztmm0121].Tipo_de_veiculo ='M',[Base_de_Frete].PesoBruto,0) AS [PesoCabotagem]



    FROM 
    (((((Ztmm0106 
    INNER JOIN [BaseEmissores] 
    ON Ztmm0106.Cliente = [BaseEmissores].Emissor) 
    INNER JOIN [SemanaFornecimento] 
    ON Ztmm0106.Fornecimento = [SemanaFornecimento].Fornecimento) 
    INNER JOIN Base_de_Frete 
    ON Ztmm0106.[ZTMM0106_IDCARREG] = Base_de_Frete.ID_DT_Principal) 
    INNER JOIN KNA1 
    ON Ztmm0106.Cliente = KNA1.Cliente) 
    INNER JOIN DadosGeograficos 
    ON KNA1.Rg = DadosGeograficos.Estado) 
    INNER JOIN Ztmm0121 
    ON Ztmm0106.[ZTMM0106_IDCARREG] = Ztmm0121.ID_Carregamento

    where Base_de_Frete.ValorNotaFiscal > 0


    • Editado IgorFKModerator terça-feira, 20 de agosto de 2019 19:17 Correção no título
    terça-feira, 20 de agosto de 2019 16:55

Todas as Respostas

  • Deleted
    terça-feira, 20 de agosto de 2019 18:37
  • Amanda,

    Então, você poderia nos explicar o que exatamente a mesma deve processar e apresentar em tela?

    Algumas observações:

    1 - As condições aplicadas nos seus joins estão corretos?

    2 - Se executar somente o comando Select deixando o Insert, os resultados são apresentados?

    3 - Os comandos IIFs são realmente necessários serem aplicados? Mesmo não sendo a melhor solução, mas acredito que o uso do comando Case seria melhor.

    Pois bem, podemos analisar a sua necessidade, entender melhor as relações e aplicar outras possibilidades de obter estes dados, mas para isso, torna-se necessário conhecer mais sobre esta query.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 20 de agosto de 2019 18:42
    Moderador
  • Oi Jose, tudo bem?

    A tabela Ztmm0106 possui um total de 13.047 linhas, mas aumentará mensalmente, já que essa é uma base que será constantemente alimentada.

    A função dessa base que estou tentando construir é o desenho de uma base de frete. A Ztmm0106 traz a informação de documento de transporte (o número de identificação do veículo) além do nome dos clientes que irão receber a mercadoria.

    A tabela KNA1 possui dados específicos de cada cliente, como cidade, estado etc e ela cruza com DadosGeograficos pois essa traz informações específicas da empresa, como macrorregião e regional (divisão geográfica da companhia).

    Ztmm0121 nós utilizamos para saber o tipo de veículo da carga (carreta, truck, multiparada - mais de um cliente por entrega) e dados de paletização.

    A base de frete trás compilado todos os custos relativos ao frete de todas as cargas expedidas pela companhia; SemanaFornecimento é uma tabela auxiliar, para podermos enxergar a frequência de entrada de pedido de cada cliente e quanto isso impacta no frete.

    A Base Emissores é outra tabela auxiliar, que traz o detalhamento por todos os clientes da companhia; por exemplo, quem é o analista dessa conta, a qual coordenação pertence, se é cadastrado como cliente mensal (pede 1x por mês) ou semanal (1x por semana).

    No overview, essas são as informações que utilizamos nessa base.

    terça-feira, 20 de agosto de 2019 19:43
  • Oi Pedro! Dei detalhes sobre a minha necessidade com essa query no comentário acima do seu... Não conheço esse comendo Case, vou dar uma estudada e ver como consigo aplicar, te agradeço. Quanto ao Select, sim, quando uso só ele (especialmente fazendo o top (n) como tb sugerido no comentário acima), ele traz os dados. Estou agora tentando fazer o Insert com o top(100) antes da coluna Ztmm0106.
    terça-feira, 20 de agosto de 2019 19:48
  • Amanda,

    Ok, obrigado pelo retorno.

    Ótimo fazendo somente o Select limitando a quantidade de linhas no Top ou sem a limitação os dados são retornado, esse é um sinal que aparentemente as junções e até mesmo as regras aplicadas em suas análises estão coerentes.

    Em relação ao volume da tabela, 13.047 é um valor baixo para os dias atuais, o que precisamos analisar é o processo do insert na Tabela FretePlanLog.

    Saberia nos dizer se esta tabela FretePlanLog possui uma chave primária ou algum outro índice?

    Poderia nos mostrar a estrutura dela, existe alguma regra, coluna computada ou até mesmo outro recurso que possa estar vinculado a tabela FretePlanLog, pergunto isso pois no processo de Insert podemos estar justamente se deparando com a necessidade que o SQL Server tem de atender a outras validações ou processamentos internos para realizar o Insert.

    Já existem dados armazenados na tabela FretePlanLog?

    No que diz respeito ao Case ele é um commando lógico condicional, ao contrário do IIF() que na verdade é uma função lógica e não um operador, e quando algum argumento ou condição aplicada no IIF() não é reconhecido pelo SQL Server o mesmo acaba impactando todo trabalho e processamento da query.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 21 de agosto de 2019 11:34
    Moderador
  • Oi Pedro! Sim, a chave primária é o número do Fornecimento.

    Ainda não há nenhum dado na tabela FretePlanLog, é o primeiro insert de dados que estou tentando fazer nela. Somente fiz a query do create table com os nomes das colunas que eu precisava, e comecei a escrever a query que colei na pergunta do tópico, unindo dados de outras tabelas.

    Para contextualizar, anteriormente esses dados eram processados no Access, mas tínhamos um ponto de limitação que eram os 2G que a ferramenta consegue manter no mesmo documento, o que me obrigava a mudar de base todo ano. A migração para o SQL é justamente pra mitigar essa necessidade de criação de várias bases...

    Segui a lógica dessa base do Access que "herdei" (pois quando entrei na área, ela já existia), que é de criar uma tabela nova e inserir colunas de outras tabelas adjacentes, com os dados que eu preciso. Uma outra dúvida... consegui rodar com o top (100) fornecimento.Ztmm0106, porém ele me mostra as 100 linhas com um valor de fornecimento repetido... o código ficou igual por inteiro, mudando somente a primeira linha para:

    SELECT 

    top (100) Ztmm0106.Fornecimento, 

    ...

    O que pode ter acontecido?

    bjs e obrigada. 

    quarta-feira, 21 de agosto de 2019 14:55
  • Deleted
    quarta-feira, 21 de agosto de 2019 15:06
  • Amanda,

    Em relação as Top 100, o José Diz já abordou a pouco, trata-se um comando utilizado para limitar o retorno de linhas em tela, basicamente isso, é uma das maneiras mais comuns e tradicionais utilizadas no SQL Server para testar inicialmente se nossa query consegui retornar algum dado em cenário com quantidades acima dos milhares.

    No que se refere a query, o Access é um Database Desktop (um banco de dados para ser utilizado em estações de trabalho), muito mas muito diferente do SQL Server no que se refere a questões de processamento e capacidade de manipulação de dados, isso você já tem conhecimento no que se refere ao 2Gbs.

    O Microsoft SQL Server é um SGBD - Sistema Gerenciador de Banco de Dados, e como tal sua forma de análise, estrutura, otimizar e processar uma query é totalmente diferente do Access, por isso, que muitas das querys definidas no Access e posteriormente migradas para o SQL Server necessitam serem reescritas ou customizadas.

    No seu caso, como já foi observado, o Select esta sendo executado, retornado os dados, mas apresentando algumas inconsistência, este é outro ponto chave que você já esta podendo observar, provavelmente sua query terá que ser alterada, ainda mas na parte das junções que você definiu, o José Diz destacou para você remover os parânteses e ver que é retornado.

    Quando utilizamos junções e nossos dados retornados em tela apresentando duplicidade, em 90% dos casos este comportamento esta relacionado com uma ou mais junções na mesma query definidas de forma incoerente ou até mesmo denecessária.

    Minha sugestão, mantenha esta query da forma que está, dentro da ferramenta que você esta utilizando para trabalhar com o SQL Server, acredito eu que seja o Management Studio, conecte-se no seu banco de dados, e:

    1. Comece a montar novamente a query, digite a estrutura básica dela trazendo os dados da sua tabela principal, execute esta query;
    2. Observe os resultados, posteriormente comece a montar as junções uma a uma;
    3. Executa a cada junção o processamento deste select, fazendo as execuções e visualizando os resultados.

    Se desta forma der certo, pronto, você conseguiu reescrever a query e obter o resultado desejado, depois vamos para o Insert.

    Ok?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Sugerido como Resposta IgorFKModerator quarta-feira, 4 de setembro de 2019 19:24
    quarta-feira, 21 de agosto de 2019 17:01
    Moderador