Publicidade

Mostrando postagens com marcador SQL. Mostrar todas as postagens

PIVOT no SQL Server



Neste post estarei mostrando como é simples realizar uma consulta para gerar um resultado que seria como uma tabela de referência cruzada (pivot table, transposição de tabela, tabela dinâmica, etc) no SQL Server.

Vamos dividir o post em duas partes, nesta vamos fazer algo simples e no próximo post faremos algo mais avançado.

Uma referência cruzada ou Pivot Table é necessária quando queremos efetuar uma transposição nos dados, realizando algum cálculo (ou não).

Imagine o seguinte: Temos uma tabela com todas as vendas por marca e por cidade e desejamos exibir os resultados colocando as marcas como linhas e as cidades como colunas, assim cada marca terá somente uma linha na consulta final. Assim deixamos o resultado mais resumido e de fácil visualização.

A tabela

Nossa tabela VENDAS tem o layout assim:


Como citei anteriormente queremos visualizar as cidades como colunas e o layout final ficará assim:


Pra fazer isso é muito, muito simples, abra a query no SQL Server e siga o mesmo caminho abaixo:



Análise

1 – Observe que fiz uma subquery e dei o nome de PT, podíamos ter adicionado até uma função agregada. O importante é esta query ter todas as colunas que precisamos.

2 – Depois foi só utilizar o PIVOT para agregar os dados e colocar as linhas como colunas.

É SÓ ISSO!!!

Basta adaptar pra sua necessidade.



Fonte: http://debulhado.wordpress.com/2012/07/29/pivot-no-sql-server-parte-i/




Precedência das cláusulas SQL


Bom pessoal,

A algum tempo atrás precisei ajudar um colega meu do trabalho a fazer uma Query em que ele precisava, por algum motivo, primeiro utilizar a cláusula ORDER BY e depois a WHERE. Quando um comando SQL está em execução temos que obedecer as regras de precedência, que no caso do exemplo do meu colega de trabalho está "errado", pois a ordem de precedência é essa:
  1. Cláusula FROM 
  2. Cláusula WHERE 
  3. Cláusula GROUP BY 
  4. Cláusula HAVING 
  5. Cláusula SELECT 
  6. Cláusula ORDER BY
Pesquisando aqui, encontrei algumas dicas interessantes para três dessas clausulas:

Cláusula FROM

Como esta é a primeira cláusula a rodar, torna-se bem interessante restringir a entrada de dados e o volume a ser processado aqui.
Uma dica valiosa…
Faça relacionamentos usando, como no exemplo:


SELECT * FROM tabela1 INNER JOIN tabela2 ON (tabela1.id=tabela2.id AND tabela2.tipo=5)

Explicando… Estou pegando dados relacionados da tabela1 e da tabela2 pelo campo id das duas e impondo que só preciso dos dados da tabela que tenha tabela2.tipo=5… Com isso, os outros tipos, sejam lá quais forem, não terão a entrada nos dados válidos para a consulta. Mais ainda… Se a tabela1 e tabela2 formariam, por exemplo, 49000 registros, separados pelo tipo 5, isso ficaria em 780 registros dos 49000 registros totais, por exemplo, apenas os 780 registros serão dados como entrada pela cláusula FROM desta query. O meu espaço amostral restringiu bastante.

Cláusula WHERE

Como a cláusula WHERE é a segunda a rodar na consulta, podemos enfrentar problemas de não ter disponível algo porque a precedência não foi obedecida.

Exemplo:
SELECT marcas AS VEICULO não me permitirá utilizar na cláusula WHERE, o alias VEICULO, porque VEICULO não foi formado ainda porque o SELECT ainda não rodou…

Na WHERE, procure colocar os dados mais acertivos da análise, depois de tê-los restringidos no FROM.

Cláusula ORDER BY

Agora é a confusão geral… Os dados das colunas do SELECT não estão disponíveis na cláusula WHERE, mas eles estão disponíveis na cláusula ORDER BY!!!

Como SELECT é executada antes de ORDER BY, os dados do SELECT estarão disponíveis quando for executado o ORDER BY.

É isso...