Vamos dar uns toques de SQL? XI

7 Comentários

Por Pedro Gaspar para o PPLWARE

Ao longo de mais de 10 semana temos apresentado alguns conceitos e funções sobre a linguagem SQL (ver artigos relacionados). A discussão do tema por parte dos nossos leitores tem sido fantástica e a partilha de conhecimento e experiência de cada um tem contribuído para um melhor uso de determinadas funções.

Esta semana vamos aprender a agrupar informação com a função GROUP BY.sql_00

A utilização do GROUP BY permite agrupar um conjunto de informação por uma ou várias colunas.

SELECT column_name
FROM table_name
WHERE column_name operator value
GROUP BY column_name

Vamos a alguns exemplos.Como de costumo iremos utilizar a nossa tabela tbl_pplware que contem de momento os seguintes dados:

tbl_1 

EXEMPLO1

Objectivo:
Apresentar a soma do ano de nascimento e o numero de pessoas que existem por cada cor de cabelo.

Query:

SELECT cor_cabelo, COUNT( * ) AS total, SUM( nascimento ) AS soma
FROM `tbl_pplware`
GROUP BY cor_cabelo

tbl_11

Num agrupamento de resultados alem de poder-mos somar o valor de resultados agrupados também poderemos escolher qual o valor maior e menor dentro desse resultado, para isso utilizamos as funções MAX() e MIN()

EXEMPLO2

Objectivo:
Apresentar a idade da pessoa mais velha e da pessoa pertencente a cada morada

Query:

SELECT morada, MAX( YEAR( NOW( ) ) - nascimento ) AS maisvelho, MIN( YEAR( NOW( ) ) - nascimento ) AS maisnovo 
FROM `tbl_pplware` 
GROUP BY morada

Resultado:

tbl_2

A utilização do GROUP BY é relativamente simples mas de extrema utilidade. Caso tenham alguma sugestão para próximos artigos podem deixar nos comentários. Desta forma podemos ir de encontro as vossas necessidades.

Partilhar:
Tags:

Comentários

7

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Diogo Velho
    Diogo Velho

    Olá,

    Os tutoriais estão espetaculares.

    Gostava de ver um tutorial sobre o comando GROUP BY ROLLUP.

    Continua com o bom trabalho.

    Abraço para o pplware

  2. Avatar de Márcio
    Márcio

    Gostava se possível se alguém consegue dar-me um query para o seguinte:
    Actualizar um campo chamado ‘ordem’ que vai de 1 a 10 duma tabela conteúdos, sabendo que vamos apagar o conteúdo 6.
    Assim ficaria com 9 conteúdos no total e ordenado pelo campo ordem que ficava: 1,2,3,4,5,7,8,9,10.
    O objectivo aqui é organizar o campo ‘ordem’ para 1,2,3,4,5,6,7,8,9 pois acabamos de apagar um registo.

    1. Avatar de Duarte Brito
      Duarte Brito

      A tua duvida é em MySQL ou em T-SQL?

      Para MySQL não sei se existe, mas muito provavelmente existe…

      Mas em T-SQL tens aqui uma solução…

      –DECLARAMOS A TABELA TEMPORARIA
      DECLARE @Tabela1 TABLE(Id BIGINT, Nome NVARCHAR(MAX))

      –POPULAMOS COM ALGUNS DADOS DE EXEMPLO
      INSERT INTO @Tabela1
      SELECT 1, ‘NOME1’
      UNION ALL
      SELECT 2, ‘NOME2’
      UNION ALL
      SELECT 3, ‘NOME3’
      UNION ALL
      SELECT 4, ‘NOME4’
      UNION ALL
      SELECT 5, ‘NOME5’
      UNION ALL
      SELECT 6, ‘NOME6’
      UNION ALL
      SELECT 7, ‘NOME7’
      UNION ALL
      SELECT 8, ‘NOME8’
      UNION ALL
      SELECT 9, ‘NOME9’
      UNION ALL
      SELECT 10, ‘NOME10’

      –VALIDAMOS A INSERÇÂO DOS DADOS
      SELECT * FROM @Tabela1

      –APAGAMOS A LINHA COM O ID 6
      DELETE @Tabela1
      WHERE Id = 6

      –FAZEMOS O SELECT COM UM ROW NUMBER DE FORMA A TRAZER A ORDEM DESEJADA
      SELECT ROW_NUMBER() OVER (ORDER BY Id) AS [NOVAORDEM]
      ,Id
      ,Nome
      FROM @Tabela1

      Será que isto te serve????

      1. Avatar de Márcio
        Márcio

        Bem, era em mysql, só falta saber esta linha :
        SELECT ROW_NUMBER() OVER (ORDER BY Id) AS [NOVAORDEM]
        ,Id
        ,Nome
        FROM @Tabela1

        pois de resto sei como se faz. Pode ser que alguem com conhecimentos em mysql saiba….

        1. Avatar de MV
          MV

          Se entendi bem, o que pretendes é o seguinte:

          Considerando como tabela de exemplo (ninja_tabela):

          id(chave)
          nome
          ordem
          tipo

          – Coloquei um campo “tipo” para diferenciares entre vários itens com várias ordens;
          – no campo “ordem” tens 1,2,3,4,5,6,7,8,9,10 e, como exemplo, um tipo “iogurtes”;

          para apagares o registo 6 (que já sabes):

          delete from ninja_tabela where ordem = 6 and tipo = ‘iogurtes’

          para repores a ordem dos registos que ficam acima do que apagaste – acertar o registo de ordem 7,8,9 e 10:

          update ninja_tabela ordem=ordem-1 where ordem>6 and tipo=’iogurtes’

          este comando retira um valor a cada “ordem” que contenha um valor acima de 6, e apenas registos de tipo ‘iogurtes’

          o 7,8,9 e 10 da “ordem” passa a 6,7,8 e 9.

          Através de stored procedures ou da linguagem de programação da tua preferência, podes automatizar este processo facilmente.

          É isto que pretendes? 🙂

          1. Avatar de Márcio
            Márcio

            MV
            Simples e funcional.
            Era mesmo isso, por vezes faço coisas bem mais difíceis e um update simples as voltas que dei sem chegar ao objectivo.

            Era mesmo isso, obrigadão.

  3. Avatar de Nuno
    Nuno

    E para quando um tuturial de como criar um pequeno website para manuseamento dos dados na BD?