Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

2
respostas

[Dúvida] Error aspas duplas.

Estou encontrando um pouco de dificuldade, quando eu coloco aspas duplas, me retorna o seguinte error:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

SELECT strftime("%Y/%m", data_venda) as "Ano/Mes", count(*) as Qtd_Vendas
from vendas
group by "Ano/Mes"
ORDER by "Ano/Mes"
;

daí tentei utilizar as aspas simples e todas as vendas ficam em uma única linha.

2 respostas

Funcionou escrevendo dessa forma, mas nao sei exatamente o motivo de ter apresentado o erro.

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)
;

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?

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!