Atualmente estou usando mysql para retornar a soma de todos os dados em uma coluna que tem a mesma palavra. Para isso estou usando a seguinte consulta:
SELECT SUM(CASE WHEN status_to = 'Draft' THEN 1 END) AS draft,
SUM(CASE WHEN status_to = 'Unpublish' THEN 1 END) AS unpublish,
SUM(CASE WHEN status_to = 'Publish' THEN 1 END) AS publish,
SUM(CASE WHEN status_to = 'Action' THEN 1 END) AS action,
SUM(CASE WHEN status_to = 'Unlisted' THEN 1 END) AS unlisted,
SUM(CASE WHEN status_to = 'Sold' THEN 1 END) AS sold,
SUM(CASE WHEN status_to = 'Let' THEN 1 END) AS let
FROM `crm_logs`
Isso fornece a saída correta no meu banco de dados para todos os termos que especifiquei, mas agora descobri que há mais variáveis de status no banco de dados além das especificadas acima. Então eu quero uma forma de ter a mesma funcionalidade dessa declaração, mas tornar a variável de status dinâmica.
Basicamente se esta for a consulta SUM(CASE WHEN status_to = 'Draft' THEN 1 END) AS draft
, ambas as ocorrências de rascunho devem ser dinâmicas.
Escreva um procedimento armazenado que construa a consulta usando
CONCAT()
e a execute viaPREPARE
eEXECUTE
.Ou construa a consulta em sua linguagem de aplicativo usando suas funções de string.
Quanto à discussão na resposta do wiki , adiciono isso
Mas isso só é necessário se
status_to
puder serNULL
. Caso contrário, isso funciona:Há uma maneira muito mais fácil de fazer o que você quer - eu estava pensando nisso ontem à noite - veja meu segundo violino aqui .
Você pode fazer algo como o seguinte (todo o código abaixo está disponível no violino aqui ):
Em seguida, preencha-o:
Observe que adicionei 2 valores singleton (
Single_1
eSingle_2
) para examinar como alguém, por exemplo, contaria osDISTINCT
valores que tinham mais de 1 registro em sua tabela ... é muito mais difícil com SQL "clássico" - com funções de janela, é muito fácil.A nova consulta "simples" é:
(Novo) resultado:
Observe a extrema diferença nos resultados
EXPLAIN ANALYZE
na parte inferior do violino para esta nova consulta e minha antiga!Esta consulta demonstra como você pode facilmente escolher os
DISINCT
valoresstatus_to
que têm mais de um registro:Resultado:
8 = 10 (total) menos os 2 singletons!
Também incluí este SQL - que permite contar facilmente (manualmente) o número de
UNIQUE
entradas.Resultado:
Deixei mais alguns trechos no segundo violino - se você realmente quiser aprender sobre SQL, convido você a ver tanto o antigo quanto o novo e também tentar executar o código usando o PostgreSQL - é interessante!
Finalmente, se você deseja construir dinamicamente uma linha (conforme sua pergunta original) com todos os seus
DISTINCT
valores e seusCOUNT()
s, então você pode usar alguma forma deRECURSIVE CTE
- mas isso é para outra pergunta!jkavalik : Você deve fazer:
Tem dados em linhas em vez de colunas, mas isso é um detalhe. Se você realmente precisar, isso também pode ser resolvido com SQL dinâmico, mas o group by ainda é melhor como uma consulta base.
Akina : No MySQL você pode usar não
SUM(CASE WHEN status_to = 'Draft' THEN 1 END)
mas mais simples (e claro)SUM(status_to = 'Draft')
.Além disso, essa expressão produzirá zero em vez de NULL se nenhuma linha corresponder.
count(status_to = 'Draft')
contaria todos os valores não nulos , independentemente do valor.SUM(status_to = 'Draft')
produzirá null somente quando nenhumstatus_to
valor não nulo estiver presente.Lennart :
count(nullif(status_to = 'Draft',0))
lidaria com ambas as situações.