Oi, Marco! Como vai?
O erro apresentado foi:
SQLITE_ERROR: sqlite3 result code 1: no such column: "%Y/%m" - should this be a string literal in single-quotes?
Esse erro aconteceu por causa do uso de aspas duplas dentro da função strftime().
Na primeira consulta, você escreveu:
strftime("%Y/%m", data_venda)
Atualmente no SQLite, as aspas duplas podem ser interpretadas como identificadores, ou seja, como nomes de colunas, tabelas ou aliases. Por isso, o SQLite tentou entender "%Y/%m" como se fosse uma coluna da tabela. Como essa coluna não existe, ele retornou a mensagem de erro dizendo que não encontrou a coluna "%Y/%m".
Como %Y/%m é um formato de data, ele precisa ser tratado como um texto literal. Para isso, podemos usar aspas simples:
strftime('%Y/%m', data_venda)
Por esse motivo, a segunda versão funcionou corretamente:
SELECT
strftime('%Y/%m', data_venda) AS 'Ano/Mes',
COUNT(*) AS Qtd_Vendas
FROM vendas
GROUP BY strftime('%Y/%m', data_venda)
ORDER BY strftime('%Y/%m', data_venda);
Outro ponto importante é que, na segunda consulta, você repetiu a expressão strftime('%Y/%m', data_venda) no GROUP BY e no ORDER BY. Essa é uma forma mais segura, porque o agrupamento e a ordenação usam exatamente o mesmo cálculo feito no SELECT.
Também seria possível manter o alias com aspas duplas, assim:
SELECT
strftime('%Y/%m', data_venda) AS "Ano/Mes",
COUNT(*) AS Qtd_Vendas
FROM vendas
GROUP BY strftime('%Y/%m', data_venda)
ORDER BY strftime('%Y/%m', data_venda);
Dica: em SQL, use aspas simples para valores de texto, como '%Y/%m', e use aspas duplas quando quiser delimitar nomes de colunas ou aliases, como "Ano/Mes".
Você chegou a testar outros formatos no strftime(), como '%Y' para agrupar apenas por ano ou '%m' para agrupar apenas por mês?
Conteúdo relacionado:
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!