Também dá pra selecionar do que foi selecionado, é chamado de sub-select
Primeiro um detalhe no comando anterior: faltou dar um nome para as "novas colunas"
SELECT
DATE_FORMAT( DATA, '%Y-%m' ) AS MES,
SUM( VALOR ) AS SOMA
FROM VENDAS
GROUP BY DATE_FORMAT( DATA, '%Y-%m' )
Se esse vai ser um sub-select, também precisamos dar um nome a esse "temporario".
Ele vai acabar sendo usado assim
( SELECT
DATE_FORMAT( DATA, '%Y-%m' ) AS MES,
SUM( VALOR ) AS SOMA
FROM VENDAS
GROUP BY DATE_FORMAT( DATA, '%Y-%m' )
)
AS PRIMEIROSELECT
Podemos fazer depois
SELECT MES, SOMA FROM ( Aqui_Entra_o_Comando_Acima ) AS PRIMEIROSELECT
Note que o select usa os nomes resultado do comando anterior.
NÃO pode usar nome repetido, existente na(s) tabela(s) usada(s) no comando, já que no caso de nome repetido o SQL não vai saber a qual deles se refere.
Muita atenção nisso. Tudo depende de como o comando é formado, há casos onde pode fazer isso, desde que esteja claro de onde vém a informação.
Com certeza, em cada resultado não pode ter nome repetido, mas podemos usar o AS pra trocar o nome.
SELECT MES, MES AS OUTROMES, SOMA, SOMA AS OUTRASOMA FROM ( Aqui_Entra_o_Comando_Acima ) AS PRIMEIROSELECT
o resultado vão ser os campos mes, outromes, soma, outrasoma
Que tal mostrar isso acima, um mês por coluna? 2020-07 2020-06 2020-05
E que tal um cliente por linha?
Tá, tudo bem, mas antes disso vamos a uma coisa importante:
Vamos mostrar só os meses 5, 6 e 7? Então não precisamos somar tudo, só os valores destes três meses.
E o melhor é alterar no que faz a soma, pra não ter tanta informação na memória do MySQL, antes de fazer o resto
SELECT
CLIENTE, DATE_FORMAT( DATA, '%Y-%m' ) AS MES, SUM( VALOR ) AS SOMA
FROM VENDAS
WHERE DATA BETWEEN '2020-05-01' AND 2020-07-31'
GROUP BY CLIENTE, DATE_FORMAT( DATA, '%Y-%m' )
Pronto.
Agora vamos ao select encima desse select
SELECT
CLIENTE,
SUM( IF( MES = '2020-07', SOMA, 0 ) ) AS JULHO,
SUM( IF( MES = '2020-06', SOMA, 0 ) ) AS JUNHO,
SUM( IF( MES = '2020-05', SOMA, 0 ) ) AS MAIO
FROM ( O_SELECT_ACIMA ) AS PRIMEIROSELECT
GROUP BY CLIENTE
Nada extraordinário, usa o valor, se o valor pertencer à coluna
O detalhe a mais aqui, é que precisa agrupar por cliente, senão vai continuar saindo um mês em cada linha, por isso o group by
O comando inteiro:
SELECT
CLIENTE,
SUM( IF( MES = '2020-07', SOMA, 0 ) ) AS JULHO,
SUM( IF( MES = '2020-06', SOMA, 0 ) ) AS JUNHO,
SUM( IF( MES = '2020-05', SOMA, 0 ) ) AS MAIO
FROM
(
SELECT
CLIENTE, DATE_FORMAT( DATA, '%Y-%m' ) AS MES, SUM( VALOR ) AS SOMA
FROM VENDAS
WHERE DATA BETWEEN '2020-05-01 AND 2020-07-31'
GROUP BY CLIENTE, DATE_FORMAT( DATA, '%Y-%m' )
) AS PRIMEIROSELECT
GROUP BY CLIENTE
Lógico, não precisa ser nome grande, pode ser A, ao invés de PRIMEIROSELECT
Mas aqui já deu pra ter uma idéia de como as possibilidades são infinitas.
A partir daÃ, é pesquisar funções disponÃveis, e tudo que pode ser feito.
Mas faltou uma coisa:
NÃO está limitado a uma tabela por vez, podemos buscar qualquer coisa de qualquer lugar, junto, misturado, relacionado, etc. etc.
É TUDO, qualquer informação de qualquer lugar, usando um único comando, tanto faz se a informação está parte em uma tabela ou parte em outra, ou de várias tabelas separadas.... é um único comando trazendo tudo de todas.
Nota: fui escrevendo os comandos durante o post, pode ter algum erro, mas é lógico... quando chegar a hora de usar, uma pesquisa rápida resolve qualquer eventual problema.