Se eu tiver uma tabela MySQL parecida com esta:
número de página da ação company_name ------------------------------- Empresa A PRINT 3 Empresa A PRINT 2 Empresa A PRINT 3 Empresa B EMAIL Empresa B PRINT 2 Empresa B PRINT 2 Empresa B PRINT 1 Empresa A PRINT 3
É possível executar uma consulta MySQL para obter uma saída como esta:
company_name EMAIL PRINT 1 páginas PRINT 2 páginas PRINT 3 páginas -------------------------------------------------- ----------- EmpresaA 0 0 1 3 EmpresaB 1 1 2 0
A idéia é que pagecount
pode variar, de modo que o valor da coluna de saída reflita isso, uma coluna para cada action
/ pagecount
par e, em seguida, número de ocorrências por company_name
. Não tenho certeza se isso é chamado de tabela dinâmica, mas alguém sugeriu isso?
Respostas:
Basicamente, essa é uma tabela dinâmica.
Um bom tutorial sobre como conseguir isso pode ser encontrado aqui: http://www.artfulsoftware.com/infotree/qrytip.php?id=78
Aconselho a leitura deste post e adapto esta solução às suas necessidades.
Atualizar
Depois que o link acima não está mais disponível no momento, sinto-me obrigado a fornecer algumas informações adicionais para todos vocês que procuram por respostas dinâmicas do mysql aqui. Ele realmente tinha uma grande quantidade de informações e não colocarei tudo aqui (ainda mais porque não quero copiar seu vasto conhecimento), mas darei alguns conselhos sobre como lidar com o pivô tabelas da maneira sql geralmente com o exemplo de peku que fez a pergunta em primeiro lugar.
Talvez o link volte em breve, eu vou ficar de olho nele.
A maneira da planilha ...
Muitas pessoas usam apenas uma ferramenta como MSExcel, OpenOffice ou outras ferramentas de planilha para esse fim. Esta é uma solução válida, basta copiar os dados e usar as ferramentas que a GUI oferece para resolver isso.
Mas ... essa não era a questão, e pode até levar a algumas desvantagens, como como inserir os dados na planilha, dimensionamento problemático e assim por diante.
O jeito SQL ...
Dada a tabela dele, é algo como isto:
Agora olhe para a tabela desejada:
As linhas (
EMAIL
,PRINT x pages
) se assemelham às condições. O agrupamento principal é porcompany_name
.Para configurar as condições, isso significa que você usa a
CASE
instrução-. A fim de grupo por alguma coisa, bem, uso ...GROUP BY
.O SQL básico que fornece esse pivô pode se parecer com isso:
Isso deve fornecer o resultado desejado muito rapidamente. A principal desvantagem dessa abordagem, quanto mais linhas você deseja na sua tabela dinâmica, mais condições você precisa definir na sua instrução SQL.
Isso também pode ser resolvido, portanto, as pessoas tendem a usar declarações, rotinas, contadores preparados e outros.
Alguns links adicionais sobre este tópico:
fonte
Minha solução está no T-SQL sem nenhum pivô:
fonte
SUM()
só pode funcionar com dados numéricos se você precisar dinamizar seqüências de caracteres que você precisará usar #MAX()
SUM(CASE WHEN (action='PRINT' AND pagecount=1) THEN 1 ELSE 0 END)
, você pode fazer isso,SUM(action='PRINT' AND pagecount=1)
já que a condição será convertida em1
quando for verdadeira e0
quando for falsaPara o MySQL, você pode colocar diretamente as condições em
SUM()
função e elas serão avaliadas como booleanas0
ou,1
portanto, você poderá ter sua contagem com base em seus critérios sem usarIF/CASE
instruçõesDEMO
fonte
crosstab()
.Para dinâmica dinâmica, use
GROUP_CONCAT
comCONCAT
. A função GROUP_CONCAT concatena seqüências de caracteres de um grupo em uma sequência com várias opções.DEMO AQUI
fonte
Uma versão stardard-SQL usando lógica booleana :
SQL Fiddle.
Quão?
TRUE OR NULL
rendimentosTRUE
.FALSE OR NULL
rendimentosNULL
.NULL OR NULL
rendimentosNULL
.E
COUNT
conta apenas valores não nulos. Voilá.fonte
A resposta correta é:
fonte
other_value
tabela?SET
consulta para aumentar o valor padrão que é limitado a 1024 para GROUP_CONCAT após 1024 GROUP_CONCAT simplesmente trunca a string sem um erro, o que significa que resultados inesperados podem acontecer ..Existe uma ferramenta chamada MySQL Pivot table generator, que pode ajudá-lo a criar uma tabela dinâmica baseada na Web que você pode exportar posteriormente para o Excel (se desejar). pode funcionar se seus dados estiverem em uma única tabela ou em várias tabelas.
Tudo o que você precisa fazer é especificar a fonte de dados das colunas (ela suporta colunas dinâmicas), linhas, valores no corpo da tabela e relacionamento da tabela (se houver)
A página inicial desta ferramenta é http://mysqlpivottable.net
fonte
fonte