Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

TeixeiraRamos

Consulta Tabela de Referencia Cruzada - MySQL

Recommended Posts

Já postei algo parecido mas a consulta foi deletada e não consegui criar outra igual para resulver.

Essa é a tabela como deve ficar:

Uma coluna Ano com os anos e as quantidades em cada continentes.

| Ano | África | América do Norte | América do Sul | Antártica | Ásia | Europa | Oceania | Total |

| 2010/2014 | 181 | 218 | 1015 | 2 | 97 | 765 | 11 | 2289 |

| 2015 | 23 | 28 | 46 | 0 | 9 | 73 | 0 | 179 |

| 2016 | 2 | 5 | 7 | 0 | 0 | 5 | 0 | 19 |

| Total | 206 | 251 | 1068 | 2 | 106 | 843 | 11 | 2487 |

A views (qry_conta_pais_por_continentes_02) que estou trabalhando tem as colunas com os registros:

| indica_ano_acumulado_ou_nao | nome_continente | SomaDeContarnome_continente |

| 2010/2014 | África | 181 |

| 2015 | África | 23 |

| 2016 | África | 2 |

| 2010/2014 | América do Norte | 218 |

| 2015 | América do Norte | 28 |

| 2016 | América do Norte | 5 |

E assim sucessivamente:

O que estou fazendo para criar o primeiro quadro acima:

SELECT nome_continente,
SUM(IF(nome_continente = 'África', SomaDeContarDenome_continente,0)) AS africa_2010_2014 
FROM qry_conta_pais_por_continentes_02 
WHERE
nome_continente = 'África' 
GROUP BY nome_continente;

O resultado é esse:

| nome_continente | africa_2010_2014 |

África | 206 |

A SQL está somando e colocando o total de todos os anos da África. Não é isso.

Tenho que incluir mais uma condição no IF, ou seja, que pegue o valor do continente "África", mas somente do ano 2010/2014 que no caso seria 181.

Já tentei de diversas forma incluir mais uma condição no IF mas não funciona.

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado Motta,

Ocorreu o seguinte deletei a minha views acidentalmente. Por incrível que pareça não estou conseguindo criar uma igual de forma a ter sucesso com o exemplo do link (você tem razão).

Tive que criar nova consulta.

Mesmo com as sua orientações:

No WHEN coloque também a condição da data.

(Continente"'africa' and ano beetwen 2011 and 2014) then ...

Não consigo um entendimento.

Contudo, eu consegui com esse código cria o quadro conforme eu desejo porém só para o continente África.

Incluindo outro não funciona:

Por favor veja:

Funcionou corretamente como eu esperava. Observe o resultado.

SELECT indica_ano_acumulado_ou_nao AS anos,
SUM(IF(nome_continente = 'África', SomaDeContarDenome_continente,0)) AS africa 
FROM qry_conta_pais_por_continentes_02 
WHERE
nome_continente = 'África' 
GROUP BY indica_ano_acumulado_ou_nao;

Resultado

| Ano | africa |

| 2010/2014 | 181 |

| 2015 | 23 |

| 2016 | 2

Mas incluindo outro continente não tive sucesso

SQL eu não entendi que não coloquei condição de ano e funcionou. Só iniciei no SELECT a coluna que contem os anos.

SELECT indica_ano_acumulado_ou_nao,
SUM(IF(nome_continente = 'África', SomaDeContarDenome_continente,0)) AS africa 
SUM(IF(nome_continente = 'América do Norte', SomaDeContarDenome_continente,0)) AS america_do_norte 
FROM qry_conta_pais_por_continentes_02 
WHERE
nome_continente = 'África' 
nome_continente = 'América do Norte'
GROUP BY indica_ano_acumulado_ou_nao;

Com relação a sua dica, já imprimi e vou estudar.

Muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido:

Faltava (,) vírgulas e o operador lógico OR

Aqui SQL funcionando:

SELECT indica_ano_acumulado_ou_nao AS anos,
SUM(IF(nome_continente = 'África', SomaDeContarDenome_continente,0)) AS africa, 
SUM(IF(nome_continente = 'América do Norte', SomaDeContarDenome_continente,0)) AS america_do_norte,
SUM(IF(nome_continente = 'América do Sul', SomaDeContarDenome_continente,0)) AS america_do_sul, 
SUM(IF(nome_continente = 'Antártica', SomaDeContarDenome_continente,0)) AS antartica,
SUM(IF(nome_continente = 'Ásia', SomaDeContarDenome_continente,0)) AS asia,
SUM(IF(nome_continente = 'Europa', SomaDeContarDenome_continente,0)) AS europa,
SUM(IF(nome_continente = 'Oceânia', SomaDeContarDenome_continente,0)) AS oceania
FROM qry_conta_pais_por_continentes_02 
WHERE
nome_continente = 'África' OR
nome_continente = 'América do Norte' OR
nome_continente = 'América do Sul' OR
nome_continente = 'Antártica' OR
nome_continente = 'Ásia' OR
nome_continente = 'Europa' OR
nome_continente = 'Oceânia'
GROUP BY indica_ano_acumulado_ou_nao;

Compartilhar este post


Link para o post
Compartilhar em outros sites

TAMBEM PODERIA SER

WHERE
nome_continente IN ('África' ,'América do Norte' O, 'América do Sul' , 'Antártica' , 'Ásia' , 'Europa' , 'Oceânia')

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por favor,

Depois do ultimo SUM tenho que colocar uma linha para criar uma coluna com o "Total" de cada continente por ano.

Não estou conseguindo:

SQL;

DELIMITER $$

ALTER ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `qry_conta_pais_por_continentes_03_para_pag_continentes` AS 
SELECT
  `qry_conta_pais_por_continentes_02`.`indica_ano_acumulado_ou_nao` AS `anos`,
  SUM(IF((`qry_conta_pais_por_continentes_02`.`nome_continente` = 'África'),`qry_conta_pais_por_continentes_02`.`SomaDeContarDenome_continente`,0)) AS `africa`,
  SUM(IF((`qry_conta_pais_por_continentes_02`.`nome_continente` = 'América do Norte'),`qry_conta_pais_por_continentes_02`.`SomaDeContarDenome_continente`,0)) AS `america_do_norte`,
  SUM(IF((`qry_conta_pais_por_continentes_02`.`nome_continente` = 'América do Sul'),`qry_conta_pais_por_continentes_02`.`SomaDeContarDenome_continente`,0)) AS `america_do_sul`,
  SUM(IF((`qry_conta_pais_por_continentes_02`.`nome_continente` = 'Antártica'),`qry_conta_pais_por_continentes_02`.`SomaDeContarDenome_continente`,0)) AS `antartica`,
  SUM(IF((`qry_conta_pais_por_continentes_02`.`nome_continente` = 'Ásia'),`qry_conta_pais_por_continentes_02`.`SomaDeContarDenome_continente`,0)) AS `asia`,
  SUM(IF((`qry_conta_pais_por_continentes_02`.`nome_continente` = 'Europa'),`qry_conta_pais_por_continentes_02`.`SomaDeContarDenome_continente`,0)) AS `europa`,
  SUM(IF((`qry_conta_pais_por_continentes_02`.`nome_continente` = 'Oceânia'),`qry_conta_pais_por_continentes_02`.`SomaDeContarDenome_continente`,0)) AS `oceania`
FROM `qry_conta_pais_por_continentes_02`
WHERE ((`qry_conta_pais_por_continentes_02`.`nome_continente` = 'África')
        OR (`qry_conta_pais_por_continentes_02`.`nome_continente` = 'América do Norte')
        OR (`qry_conta_pais_por_continentes_02`.`nome_continente` = 'América do Sul')
        OR (`qry_conta_pais_por_continentes_02`.`nome_continente` = 'Antártica')
        OR (`qry_conta_pais_por_continentes_02`.`nome_continente` = 'Ásia')
        OR (`qry_conta_pais_por_continentes_02`.`nome_continente` = 'Europa')
        OR (`qry_conta_pais_por_continentes_02`.`nome_continente` = 'Oceânia'))
GROUP BY `qry_conta_pais_por_continentes_02`.`indica_ano_acumulado_ou_nao`$$

DELIMITER ;

O Resultado faltando a coluna "Total"

| Ano | africa | america_do_norte | america_do_sul | antartica | asia | europa | oceania | Total |

| 2010/2014 | 181 | 221 | 1015 | 2 | 97 | 762 | 11 | |

| 2015 | 23 | 28 | 46 | 0 | 9 | 73 | 0 | |

| 2016 | 2 | 5 | 7 | 0 | 0 | 5 | 0 | |

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obtive êxito digitando depois do ultimo SUM o seguinte:

SUM((CASE WHEN (qry_conta_pais_por_continentes_02.nome_continente = (((((('África' + 'América do Norte') + 'América do Sul') + 'Antártica') + 'Ásia') + 'Europa') + 'Oceânia')) THEN
  qry_conta_pais_por_continentes_02.SomaDeContarDenome_continente ELSE 0 END)) AS t_pais_geral 

| Ano | africa | america_do_norte | america_do_sul | antartica | asia | europa | oceania | Total |

| 2010/2014 | 181 | 221 | 1015 | 2 | 97 | 762 | 11 | 2289 |

| 2015 | 23 | 28 | 46 | 0 | 9 | 73 | 0 | 179 |

| 2016 | 2 | 5 | 7 | 0 | 0 | 5 | 0 | 19 |

| Total | | | | | | | | |

Mas ainda tenho um grande desafio. Os totais na horizontal eu criei ou outra views. Funciona? Sim,mas acredito que na mesma views tenha condições de somar horizontalmente.

Obrigado Motta pelo incentivo.

Sucesso a todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.