Jump to content
GuiPetenuci

Query retorna o resultado justo, Mas na View nao

Recommended Posts

Boa tarde,

Estou com um problema e estou ficando louco, ja li praticamente todos as respostas de View de SQL Server no Stack Overflow e a maioria da documentacao da MSFT

 

Tenho uma view que faz algumas queries malucas que o cliente precisa, mas ela nao retorna o resultado justo, e se eu pegar o codigo e fazer uma query simples com o codigo, o resultado è ok.

 

Codigo da View

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


/****** Object:  View [QEHS].[V_FactMonitorings25261gui]    Script Date: 11/07/2019 16:24:53 ******/

CREATE view 
    [QEHS].[V_FactMonitorings25261gui]
as 

    with
    Plants as 
    (
        select distinct 
            [plant-id] 
        from 
            [QEHS].[Fact-Monitorings-H&S]            
    ) , 
    MIDs as 
    (
        select mid 
        from 
        (
            values
                ( 'MON.02.25 Total number of LTA free days (calendar days)')
                ,( 'MON.02.26 Total number of TRI free days (calendar days)') 
        ) as x(mid) 
    ), 
    PlantList 
    AS
    (
        select 
            a.date, 
            b.[plant-id], 
            c.mid
        from 
            QEHS.Calendar_Gen A 
            cross join 
            plants b    
            cross join mids c
        where 
            year(a.date) >= 2011
    ), 
    help1 as 
    (
        SELECT 
            p.date, 
            p.[plant-id],
            p.mid, 
            t.value,
            (
            case 
                when (year(p.date) = year(getdate()) and month(p.date) = month(getdate())) then 
                    day(getdate()) 
                else 
                    iif(t.value is not null, 0, day(eomonth(p.date)))            
                end 
            
            ) Days, 
            cast(isnull(cast(t.value as bit),0) as integer) reset 
        FROM 
            PLANTLIST p 
            left join 
            [QEHS].[Fact-Monitorings-H&S] T
            on
            (
                 p.date = t.date and 
                 p.[plant-id] = t.[plant-id] and 
                 p.mid = t.[monitoring-id] 
            )             
    ), 
    help2 as 
    (
        select 
            date, 
            [plant-id], 
            mid, 
            value, 
            days, 
            reset,
            formatmessage('%s%s%d', [plant-id], mid,sum(reset) over 
                ( 
                    partition by  [plant-id], mid 
                    order by  date, [plant-id], mid
                )
            ) grp
        from
            help1 
        where 
            year(date) >= (select year(min(date)) from [QEHS].[Fact-Monitorings-H&S])        
    ),
    help3 as 
    (
        select 
            date, 
            [plant-id], 
            mid, 
            value, 
            days, 
            first_value(value) over (partition by grp order by date, [plant-id], mid) fullvalue
        from 
            help2 
    ) 
    -- 
    select 
        date, 
        [plant-id], 
        mid, 
        isnull(a.Value, 
            fullvalue +sum(days) over 
            (
                 partition by [plant-id], mid, fullvalue 
                 order by  mid, date, [plant-id]
                 rows between unbounded preceding and current row
            ) 
        ) total
    from 
        help3 a
        
GO

a view retorna assim:

image.png.d268b4e95c7d50105620f3c03ecbb697.png

 

Agora se eu pegar e fazer a query "na mao", retorna assim, que è o justo:

image.png.1a0178f8b0871d85c6a5cd9c5a9d2911.png

 

Agora, porque na view retorna um e a query retorna outro? o.o

Share this post


Link to post
Share on other sites

Pode ser algo no momento da execução, imaginando o cenário com sua CTE.

São todas tabelas fisicas?

Tente dar um um count ou fazer o select por fora para um debug mais preciso

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Jefferson andre
      Ola, alguem pode me ajudar a preencher corretamente o campo de razao social do cliente por favor. 
       
      Na tabela o campo id esta preenchendo corretamente
       
      Obrigado pela ajuda
       
      <label for="inputNome">Cliente</label> <br> <?php require_once('conexao_dbo.php'); $filtro_clientes = $arquivo->prepare("SELECT id, razao,deletado, ativo, id_empresa FROM clientes WHERE deletado=0 AND id_empresa='$id_empresa' ORDER BY ativo,razao"); $filtro_clientes->execute(); $filtro_cliente_atual = $filtro_clientes->fetch(); //print_r($filtro_clientes); ?> <select class="custom-select col-md-12" required name="id_cliente" id="id_cliente" required name="cliente"> <option value='<?php echo $filtro_cliente_atual['id'];?>' selected> <?php echo $filtro_cliente_atual['razao'];?> </option> <?php while ($clientes = $filtro_clientes->fetch()) {?> <option value="<?php echo $clientes['id'] ?>"><?php echo $clientes['razao'];?> </option> <?php } ?> </select>  
    • By Omar~
      É o seguinte, tenho uma tabela de produtos a qual além de possuir características do produto já contém a coluna para o link da mesma.
      Assim sendo faço a consulta da tabela para preencher um menu com o link para cada produto, e é aqui que entra a questão:
       
      Na sua opinião o que seria mais viável ao usuário acessar um produto em questão?
      Reaproveitar o array de retorno da query ao qual usei para compor os links do menu, só que filtrar esse array mostrando o índice ao qual é acessado. Refazer a query listando somente o produto.  
      A aplicação é executada em um único arquivo.
      Onde tenho o menu HTML listando cada produto contido na tabela (A qual também guarda as demais informações do produto).
       
      Reaproveitar a query ficou meio estranho uma vez que tenho um array multi dimencional da query tenho que buscar o índice para ver se ele existe e ainda varrer o array para poder usar os dados do produto tipo assim:
      <?php // $url[1] : É o valor vindo da url // $result : É o array multi de resultado da query if (array_search($url[1], array_column($result, 'ap_link')) !== false) { foreach ($result as $value) { if ($url[1] == $value->ap_link) { // Existe o produto e a url é a mesma do link do produto break; } } } else { // O valor da url não condiz com nenhum produto registrado } Essa alternativa evita uma segunda query desnecessária aliviando o lado do SQL, porém em um arrray multo extenso pode haver lentidão para processar os dados.
      Por outro lado também ficar refazendo consultas também pode deixar a questão meio lenta.
       
      A coisa toda é porque existem centenas de produtos na tabela e em ambos os casos está demorando mais do que deveria.
      Então bateu essa dúvida, qual alternativa tomar, resolvi perguntar, pois várias cabeças peçam melhor que uma.
    • By rdavi78@gmail.com
      Senhores, recorro a ajuda de vocês pois venho do banco de dados Oracle e tenho encontrado certa dificuldade para trabalhar com o SQL Server 2012, mais especificamente com a linguagem Transact-SQL. Pelo o que eu tenho percebido, não se trata de uma linguagem fortemente tipada em relação ao gerenciamento de escopo de variáveis. Exemplo, como as variavéis de cursores, que caso a primeira interação atribua valores válidos para as variáveis e caso na segunda volta do looping seja retornado nulo é mantido o valor da primeira interação. Outra coisa que eu estou tentando entender é o fato da seguinte query dentro de um bloco não retornar resultado dinamincamente na execução:
      SELECT @IDSALAMODELO = SM.ID
            ,@NOMEGRUPO    = G.NOME
        FROM CRT C
            ,GRUPO G
            ,SALAMODELO SM
            ,EMPRESA E
       WHERE C.IDGRUPO      = G.ID
         AND G.IDSALAMODELO = SM.ID
         AND SM.IDEMPRESA   = E.ID
         --
         AND C.ID       = CAST(@CRT AS INT)
         AND C.ATIVO    = @ATIVO
         AND G.ATIVO    = @ATIVO
         AND G.IDINTAKE = @INTAKEATUAL
         AND E.ID       = @IDEMPRESA
      E quando a executo numa janela de consulta com os parametros hardcode ela me retorna resultado. Não estou limpando elas em momento algum e ja tentei deixar os valores hardcode dentro do bloco, mas ainda assim, o resultado permance o mesmo, ou seja, não me retorna resultado.
      Por isso, se possível, gostaria da opinião de vocês para que eu posso solucionar esse problema.
      Grato.
    • By DarkDucke
      Olá pessoal, preciso fazer uma consulta ma tabela produtos pelo código de barras, mais eu posso ter 100 código de barras para consultar,
      qual a melhor maneira de fazer isso, mais rápida e melhor performance... 
       
      opção 1
      fazer uma consulta em todos de uma vez, tipo
      "select * from produtos where cod_barras = '123' or cod_barras = '456' or cod_barras = '789'" ...  
      opção 2
      fazer 100 consultas, uma para cada código de barras
      for(i=1; i<100; i++) "select * from produtos where cod_barras = array[i]" ...  
      Obrigado!
    • By AlanB.
      Olá, boa tarde! Eu estou com um problema e não consigo resolver. Alguem pode me ajudar?
      Eu tenho uma seção de serviços no site (inseri a imagem como anexo para que voces possam visualizar)
       
      Basicamente são 5 colunas em que cada uma tem uma imagem, um titulo, um quadradinho que abre uma lista e quando clica em algum item da lista, abre um popup com as informações daquele item. 
       
      Para tentar fazer isso com o php eu criei a tabela "servicos" com os campos:
       
      id
      titulo (pra inserir esses titulos abaixo da imagem) - adequação, estruturação, etc.
      lista - os titulos dos itens da lista
      popup - texto com os itens da lista 
       
      Eu adicionei os itens das listas de cada coluna no phpmyadmin e consegui fazer a função de editar e excluir certinho. Mas depois disso, preciso exibir as informações na index.php 
       
      Até agora tentei fazer somente a primeira coluna de "Adequação", vejam o código na index.php para exibir:
       
      <div class="col mb-4 p-3"> <div class="d-flex justify-content-center"> <img src="img/icones/adequacao.png" alt="Adequação"> </div> <p class="mt-3 titulobranco text-center">Adequação</p> <div class="servicos d-flex justify-content-center"> <ul class="nav"> <li class="nav-item dropdown"> <img class="quadrado nav-link" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" src="img/icones/quadrado.png" alt="Conscientização"> <div class="dropdown-menu dropdown-menu-personalizado" aria-labelledby="navbarDropdown"> <?php $titulo = "Adequação"; $sql = "SELECT * FROM servicos WHERE titulo = '$titulo'"; $sql = $pdo->query($sql); if($sql->rowCount()>0){ foreach($sql->fetchAll() as $servicos){ echo'<a class="dropdown-item textoservicos">'.$servicos['lista'].'<div style="float:right; color:#27B1F7;">&#43;</div></a>'; } } ?> </div> </li> </ul>' </div> </div> Eu não sei se esse código está certo, mas está funcionando. Ele está exibindo na primeira coluna "Adequação", os itens da lista desse respectivo titulo.
       
      Mas o popup não está funcionando, ao clicar em um item da lista deveria abrir o popup com o respectivo texto cadastrado naquele item, mas não está funcionando.
       
      Esse foi o código do popup que eu fiz:
       
      <? $titulo = "Adequação"; $sql = "SELECT * FROM servicos WHERE titulo = '$titulo' "; $sql = $pdo->query($sql); if($sql->rowCount()>0){ foreach($sql->fetchAll() as $servicos){ echo '<div id="modal-servicos" class="modal-container">'; echo '<div class="modaldentro">'; echo '<button class="fecharmodal">X</button>'; echo '<h3>'.$servicos['lista'].'</h3>'; echo '<p>'.$servicos['popup'].'</p>'; echo '</div>'; echo '</div>'; } } ?> Alguem pode me ajudar a corrigir o meu código e fazer funcionar?
       
      Obrigado

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.