Clipper On Line • Ver Tópico - Select com agrupamento

Select com agrupamento

Discussão sobre SQL

Moderador: Moderadores

 

Select com agrupamento

Mensagempor asimoes » 18 Dez 2020 17:43

Resolvi
2020-12-18 17_42_06-Window.png
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Select com agrupamento

Mensagempor asimoes » 18 Dez 2020 18:06

Como tratar null? apesar de usar IFNULL não funcionou tentei também COALESCE
2020-12-18 18_04_25-Window.png
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Select com agrupamento

Mensagempor asimoes » 18 Dez 2020 18:23

Nada como um SELECT por cima pra resolver o mais interno
2020-12-18 18_21_42-Window.png

SELECT X.MES, IFNULL(X.TOTAL,0) FROM (
WITH RECURSIVE Ano AS (
SELECT 1 AS mes
UNION
SELECT mes + 1 AS mes
FROM Ano
   WHERE
    Ano.mes < 12
)
SELECT * FROM Ano
LEFT JOIN
( SELECT D_VENC AS VENCIMENTO, Sum( apa.vl_guia) AS TOTAL, YEAR(D_VENC) AS ANO
  FROM cobrancauti APA
  WHERE
  APA.D_PGTO IS NULL AND
  YEAR( APA.D_VENC )  = 2018
  GROUP BY
  MONTH( APA.D_VENC )
) AS B ON ANO.MES = MONTH( B.VENCIMENTO )

ORDER BY MES ) X
ORDER BY X.MES
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Select com agrupamento

Mensagempor JoséQuintas » 18 Dez 2020 18:31

Usou recursive e CTE ao mesmo tempo, ou isso já tinha antes?

Tem aquela função de trazer zerado, que não lembro qual era, que acho que tem neste post.
Revi o post: COALESCE()

COALESCE( a, b, c, d, e, f, 0 )

Retorna o primeiro válido, que não seja NULL.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18145
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Select com agrupamento

Mensagempor asimoes » 18 Dez 2020 18:43

Para um ano ok, mas para 3 anos, 2018 a 2020, USEI UM BETWEEN mas o resultado ficou errado

2020-12-18 18_42_43-Window.png
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Select com agrupamento

Mensagempor asimoes » 18 Dez 2020 18:46

JoséQuintas escreveu:Usou recursive e CTE ao mesmo tempo, ou isso já tinha antes?


Usei o exemplo do Alexandre, tomei uma surra pra entender mas consegui fazer funcionar, agora o problema é para um período maior por ano
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Select com agrupamento

Mensagempor alxsts » 18 Dez 2020 23:05

Olá!
asimoes escreveu:Executando essa seleção dá erro

Sim. A seleção está incompleta. A definição de um CTE termina com um ou mais comandos DML (Data Management Language) ou seja, SELECT, INSERT, UPDATE ou DELETE.

Como você precisa selecionar mais de um ano e dentro de cada ano o mês se repete, no JOIN é preciso considerar o ano também...

Modifiquei o CTE para gerar os 36 meses dos anos que vi no teu código (2018,2019 e 2020). Juntei a este novo CTE o código que você postou. Como não tenho as tuas tabelas, não consegui testar. Mas acho que falta pouco. Acho que o caminho é este. Teste o código abaixo e faça as correções necessárias.
WITH recursive Datas AS (
  -- "Membro Âncora"
  SELECT
    1 AS Mes,
    2018 AS Ano,
    1 as Loops
  UNION ALL
    -- "Membro Recursivo"
  SELECT
    CASE
      WHEN Loops % 12 = 0 THEN 1
      ELSE Mes + 1
    end,
    CASE
      WHEN Loops % 12 = 0 THEN Ano + 1
      ELSE Ano
    end,
    Loops + 1
  FROM Datas  /* Resultado da última iteração */
  WHERE
    Loops < 36
)
SELECT  *
  FROM (
      SELECT
        D_VENC AS VENCIMENTO,
        Coalesce(Sum(apa.vl_guia), 0) AS TOTAL,
        Coalesce(Month(D_VENC), Datas.Mes) AS MES,
        Coalesce(YEAR(D_VENC), Datas.Ano) AS ANO
      FROM cobrancauti APA
      WHERE
        APA.D_PGTO IS NULL
        AND YEAR(APA.D_VENC) BETWEEN 2018
        AND 2020
      GROUP BY
        MONTH(APA.D_VENC) )
      AS b
  LEFT JOIN ( SELECT Mes, Ano
                FROM Datas
            ORDER BY Ano, Mes ) AS d
    ON d.Mes = MONTH(B.VENCIMENTO)
   AND d.Ano = Year(B.VENCIMENTO)
ORDER BY
  b.MES


O CTE eu consigo testar e está funcionando.
CTE.JPG


Recursive Common Table Expression CTE
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Select com agrupamento

Mensagempor asimoes » 19 Dez 2020 13:50

2020-12-19 13_49_15-Window.png

Alexandre, deu esse erro
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Select com agrupamento

Mensagempor asimoes » 19 Dez 2020 14:01

2020-12-19 13_55_22-Window.png

Coloquei NULL para funcionar

Coalesce(Month(D_VENC),null) AS MES,
Coalesce(YEAR(D_VENC), null) AS ANO

Mas o resultado sumarizou os 3 anos em um único ano 2018
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Select com agrupamento

Mensagempor asimoes » 19 Dez 2020 14:21

Acrescentei MONTH(apa.d_venc) ) no Group By

GROUP BY
year(APA.D_VENC), MONTH(apa.d_venc) )

Mas o resultado para os meses 4 e 9 e 10 de janeiro não sairam na lista com 0,00
Teve mês que teve pagamento ABRIL, SETEMBRO E OUTUBO e não sairam na lista com 0,00
Eles tem que aparecer mesmo com 0,00 se não o Gráfico não funciona

APA.D_PGTO IS NULL aqui que é problema, nessa query se no teve pagamento deveria aparacer com 0,00

2020-12-19 14_18_34-Window.png
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Select com agrupamento

Mensagempor asimoes » 19 Dez 2020 14:41

Esse aqui fez, mas para um ano, se colocar BETWEEN 2018 AND 2020 não funciona
SELECT X.ANO, X.MES AS MES, IFNULL(X.TOTAL,0) AS TOTAL FROM (
WITH RECURSIVE Ano AS (
SELECT 1 AS MES
UNION
SELECT MES + 1 AS MES
FROM ANO
   WHERE
    Ano.mes < 12
)
SELECT * FROM ANO
LEFT JOIN
( SELECT D_VENC AS VENCIMENTO, Sum( apa.vl_guia) AS TOTAL, YEAR(D_VENC) AS ANO
  FROM cobrancauti APA
  WHERE
  APA.D_PGTO IS NULL AND
  YEAR( APA.D_VENC ) = 2018
  GROUP BY
  YEAR( APA.D_VENC ), MONTH( APA.D_VENC )
) AS B ON ANO.MES = MONTH( B.VENCIMENTO )
ORDER BY MES ) X
ORDER BY  X.MES

2020-12-19 14_39_04-Window.png
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Select com agrupamento

Mensagempor alxsts » 19 Dez 2020 14:48

Olá!
Ali onde você trocou Datas por NULL o certo é d.mes e d.ano.
Fica difícil sem os dados. Não consegue anexar as estruturas das tabelas com alguns dados?
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Select com agrupamento

Mensagempor asimoes » 19 Dez 2020 14:57

Inverti o LEFT JOIN agora funcionou
WITH recursive Datas AS (
  -- "Membro Âncora"
  SELECT
    1 AS Mes,
    2018 AS Ano,
    1 as Loops
  UNION ALL
    -- "Membro Recursivo"
  SELECT
    CASE
      WHEN Loops % 12 = 0 THEN 1
      ELSE Mes + 1
    end,
    CASE
      WHEN Loops % 12 = 0 THEN Ano + 1
      ELSE Ano
    end,
    Loops + 1
  FROM Datas  /* Resultado da última iteração */
  WHERE
    Loops < 36
)
SELECT  *
  FROM
  Datas D
  LEFT JOIN
  (
      SELECT
        D_VENC AS VENCIMENTO,
        Coalesce(Sum(apa.vl_guia), 0) AS TOTAL,
        Coalesce(Month(D_VENC),null) AS MES,
        Coalesce(YEAR(D_VENC), null) AS ANO
      FROM cobrancauti APA
      WHERE
        APA.D_PGTO IS NULL
        AND YEAR(APA.D_VENC) BETWEEN 2018
        AND 2020
       GROUP BY
        year(APA.D_VENC), MONTH(apa.d_venc) ) AS RES ON RES.ANO = D.ANO AND RES.MES  = D.MES

2020-12-19 14_56_16-Window.png
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Select com agrupamento

Mensagempor alxsts » 19 Dez 2020 15:03

Olá!

Show!!! Se trocar aqueles NULL por d.mes e d.ano acho que melhora.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Select com agrupamento

Mensagempor asimoes » 19 Dez 2020 17:53

Obrigado Alexandre e Quintas pelas dicas,

Alexandre muito legal esse recurso RECURSIVE, funcionou perfeito

Já removi a GAMBI do código, RS
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Anterior Próximo



Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro