Eu li o material nas tabelas dinâmicas do MS e ainda estou tendo problemas para corrigir isso.
Eu tenho uma tabela temporária que está sendo criada, diremos que a coluna 1 é um número da loja e a coluna 2 é um número da semana e, por fim, a coluna 3 é um total de algum tipo. Além disso, os números da semana são dinâmicos, os números das lojas são estáticos.
Store Week xCount
------- ---- ------
102 1 96
101 1 138
105 1 37
109 1 59
101 2 282
102 2 212
105 2 78
109 2 97
105 3 60
102 3 123
101 3 220
109 3 87
Gostaria que saia como uma tabela dinâmica, assim:
Store 1 2 3 4 5 6....
-----
101 138 282 220
102 96 212 123
105 37
109
Armazene números ao lado e semanas na parte superior.
sql
sql-server
pivot
pivot-table
Lynn
fonte
fonte
Respostas:
Se você estiver usando o SQL Server 2005+, poderá usar a
PIVOT
função para transformar os dados de linhas em colunas.Parece que você precisará usar o sql dinâmico se as semanas forem desconhecidas, mas é mais fácil ver o código correto usando uma versão codificada inicialmente.
Primeiro, aqui estão algumas definições e dados rápidos da tabela para uso:
Se seus valores forem conhecidos, você codificará a consulta:
Consulte Demonstração SQL
Então, se você precisar gerar o número da semana dinamicamente, seu código será:
Consulte Demonstração SQL .
A versão dinâmica gera a lista de
week
números que devem ser convertidos em colunas. Ambos dão o mesmo resultado:fonte
cte3 AS (select ... )
então você tem a lógica acima definida com o@cols
e@query
... há um erro. Nome do objeto inválido 'cte3'. Como você corrige isso. -STUFF(...)
antes (ou oXML PATH
outro). Para o benefício de outros leitores, tudo o que você está fazendo é unir os nomes das colunas e cortar a vírgula principal. Observe que o seguinte é um pouco mais simples: selecione @cols = (SELECT DISTINCT QUOTENAME (Week) + ',' da ordem yt por 1 FOR XML PATH ('')) set @cols = SUBSTRING (@cols, 1, LEN ( @cols) - 1) ... substituindo ogroup by
pordistinct
eorder by 1
e cortar manualmente um sufixo vírgula!Isso é para o número dinâmico de semanas.
Exemplo completo aqui: SQL Dynamic Pivot
fonte
Já consegui a mesma coisa usando subconsultas. Portanto, se sua tabela original fosse chamada StoreCountsByWeek e você tivesse uma tabela separada que listasse os IDs da loja, seria assim:
Uma vantagem desse método é que a sintaxe é mais clara e facilita a junção a outras tabelas para atrair outros campos para os resultados.
Meus resultados anedóticos são que a execução dessa consulta em algumas milhares de linhas foi concluída em menos de um segundo e eu tinha 7 subconsultas. Mas, como observado nos comentários, é mais caro em termos de computação fazê-lo dessa maneira; portanto, tenha cuidado ao usar esse método se você espera que ele seja executado em grandes quantidades de dados.
fonte
Isto é o que você pode fazer:
DEMO
fonte
Estou escrevendo um sp que pode ser útil para esse fim, basicamente esse sp gira qualquer tabela e retorna uma nova tabela dinâmica ou retorna apenas o conjunto de dados; é assim que se executa:
observe que no parâmetro @agg os nomes das colunas devem estar com
'['
e o parâmetro deve terminar com vírgula','
SP
Este é um exemplo de execução:
então
Select * From ##TEMPORAL1PVT
retornaria:fonte
fonte
Aqui está uma revisão da resposta do @Tayrn acima que pode ajudá-lo a entender o giro um pouco mais fácil:
Esta pode não ser a melhor maneira de fazer isso, mas foi isso que me ajudou a entender como girar as tabelas.
ID = linhas que você deseja dinamizar
MY_KEY = a coluna que você está selecionando na tabela original que contém os nomes das colunas que você deseja dinamizar.
VAL = o valor que você deseja retornar em cada coluna.
MAX (VAL) => Pode ser substituído por outras funções agregadas. SOMA (VAL), MIN (VAL), ETC ...
fonte
Apenas dê uma idéia de como outros bancos de dados resolvem esse problema.
DolphinDB
também possui suporte interno para rotação e o sql parece muito mais intuitivo e arrumado. É tão simples quanto especificar a coluna chave (Store
), a coluna dinâmica (Week
) e a métrica calculada (sum(xCount)
).O DolphinDB é um banco de dados colunar de alto desempenho. O cálculo na demonstração custa tão baixo quanto 546 ms em um laptop dell xps (i7 cpu). Para obter mais detalhes, consulte o manual on-line do DolphinDB https://www.dolphindb.com/help/index.html?pivotby.html
fonte