Advertisement
eduardocintramaia

Untitled

Sep 23rd, 2019
547
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 3.08 KB | None | 0 0
  1. # Problema
  2.  
  3. # Existe uma tabela no banco de dados MYSQL chamada "pagamentos", o problema consistia em criar uma query que retorne a soma total de vendas por hora dado um intervalo de datas, inclusive as horas que não houveram vendas com o valor zerado.
  4.  
  5.  
  6. # Existem algumas formas de solucionar esse problema, como por exemplo: a nível de aplicação ou usando tabelas temporárias, após analisar os pós e contras de cada abordagem resolvi resolver o problema da seguinte maneira:
  7.  
  8.  
  9. # 1. Criando uma tabela "horas" que irá armazenar as 24 horas.
  10.  
  11. CREATE TABLE horas (
  12. id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  13. horas VARCHAR(3) NOT NULL
  14. );
  15.  
  16. # Populando a tabela com as 24 horas:
  17.  
  18. insert into horas (horas) values('00');
  19. insert into horas (horas) values('01');
  20. insert into horas (horas) values('02');
  21. insert into horas (horas) values('03');
  22. insert into horas (horas) values('04');
  23. insert into horas (horas) values('05');
  24. insert into horas (horas) values('06');
  25. insert into horas (horas) values('07');
  26. insert into horas (horas) values('08');
  27. insert into horas (horas) values('09');
  28. insert into horas (horas) values('10');
  29. insert into horas (horas) values('11');
  30. insert into horas (horas) values('12');
  31. insert into horas (horas) values('13');
  32. insert into horas (horas) values('14');
  33. insert into horas (horas) values('15');
  34. insert into horas (horas) values('16');
  35. insert into horas (horas) values('17');
  36. insert into horas (horas) values('18');
  37. insert into horas (horas) values('19');
  38. insert into horas (horas) values('20');
  39. insert into horas (horas) values('21');
  40. insert into horas (horas) values('22');
  41. insert into horas (horas) values('23');
  42.  
  43. 2. Criando uma tabela "datas" quer irá armazenar os próximos 100 anos de datas a partir de uma data predeterminada.
  44.  
  45.  
  46. CREATE TABLE datas (
  47.     id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  48.     data DATE
  49. );
  50.  
  51. # Procedure que irá popular a tabela "datas"
  52.  
  53. DROP PROCEDURE IF EXISTS load_datas;
  54.  
  55. create procedure load_datas()
  56. begin
  57.     declare x int unsigned default 1;
  58.     WHILE x <= 36500 DO
  59.         insert into datas (data) SELECT DATE_ADD(DATE("2017-01-01"), INTERVAL x DAY);
  60.         SET x = x + 1;
  61.     END WHILE;
  62. end
  63.  
  64. CALL load_datas();
  65.  
  66. 3. Criando query que irá realizar um CROSS JOIN entre as tabelas "horas" e "datas" filtrando pelo range necessário, como resultado terei as 24 horas de cada dia do período informado. Conm o resultado do CROSS JOIN será feito um LEFT JOIN com os dados de pagamentos.
  67.  
  68.  
  69. select
  70.     datas.data as data,
  71.     coalesce(pg.valor,0) as valor
  72. from
  73.     (
  74.         select
  75.             date_format(concat(datas.data, ' ', horas.horas), '%Y-%m-%d %H') as data
  76.         from
  77.             datas
  78.         cross JOIN
  79.             horas
  80.         where
  81.             datas.data between STR_TO_DATE('15/08/2019', '%d/%m/%Y') AND STR_TO_DATE('15/08/2019', '%d/%m/%Y')
  82.     ) as datas
  83. left
  84.     join
  85.     (
  86.         select
  87.             date_format(created_date, '%Y-%m-%d %H') as datahoras,
  88.             sum(valor) as valor
  89.         from
  90.             pagamento
  91.         where
  92.             evento_id = 6
  93.         group by
  94.             date_format(created_date, '%Y-%m-%d %H')
  95.         order by
  96.                 date_format(created_date, '%Y-%m-%d %H') asc
  97.     ) as pg
  98.     on
  99.         pg.datahoras = datas.data
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement