5th Jan 2023 11 minutos de leitura Como usar o GROUP BY em SQL Tihomir Babic sql group by Índice Como o GROUP BY funciona? Um exemplo Passos para usar a cláusula GROUP BY Outras Dicas para usar GROUP BY em SQL Use um Identificador Único Agrupamento por valor Duas Colunas como o Definidor do Grupo Agrupamento por uma Expressão Passos para escrever uma consulta com funções de GROUP BY e agregar Nenhum usuário SQL pode evitar o uso de GROUP BY Neste artigo, daremos a você um guia passo a passo sobre o uso de GROUP BY em SQL. Descubra as nuances do GROUP BY cláusula e aprender diferentes maneiras de utilizá-la. GROUP BY é uma das cláusulas mais utilizadas em SQL. Ela o move de simplesmente selecionar dados do banco de dados para agrupar linhas com os mesmos valores de coluna em um único grupo. Quando usado com as funções agregadas do SQL, você pode usar GROUP BY para calcular métricas como a contagem do número de instâncias ou encontrar o valor total, médio, mínimo ou máximo. GROUP BY é parte do conhecimento básico de SQL; você precisa se sentir realmente confortável com ele antes de passar a conceitos mais complicados. Você já sabe que escrever código é melhor aprendido através da prática. Encontrar a oportunidade de escrever código SQL regularmente pode ser complicado se você não estiver trabalhando com SQL diariamente. Difícil, mas não impossível. O que torna isso possível é a Curso de Práticas em SQL curso. Os 88 exercícios oferecem muitas oportunidades para praticar GROUP BY e alguns outros conceitos SQL, tais como funções agregadas, JOINs e subconsultas. Como o GROUP BY funciona? Um exemplo Vou usar a tabela typewriter_products para demonstrar a importância da cláusula GROUP BY em SQL. Ela mostra coisas que você pode comprar de uma empresa fictícia que vende produtos relacionados à máquina de escrever. Para aqueles que podem se perguntar, esta é uma máquina de escrever: Fonte: https://i.etsystatic.com/8429430/r/il/132716/1789166606/il_fullxfull.1789166606_1qnc.jpg Quase como um computador sem tela. Quem sabe quantos livros importantes foram escritos usando uma máquina de escrever. Livros, lembra-se deles? (Mas já chega de presunção! Fale sobre a mesa!) Sim, a mesa. Ela tem as seguintes colunas: id - A identificação do registro é única. product_name - O nome do produto. product_id - O ID do produto. ribbon_brand - A marca da fita para máquina de escrever. typewriter_brand - A marca da máquina de escrever para a qual a fita é feita. ribbon_color - A cor da fita para máquina de escrever. units - O número de unidades disponíveis do produto. price - O preço do produto por unidade. Os dados em si são mostrados abaixo. idproduct_nameproduct_idribbon_brandtypewriter_brandribbon_colorunitsprice 1typewriter ribbon1All You NeedOlympiaBlack8810.00 2typewriter ribbon1All You NeedOlympiaBlack + Red4810.00 3typewriter ribbon2Ribbons & UsOlympiaBlack9712.39 4typewriter ribbon2Ribbons & UsOlympiaBlack + Red14715.15 5typewriter ribbon3All You NeedUnderwoodBlack1424.74 6typewriter ribbon3All You NeedUnderwoodBlack + Red1325.17 7typewriter ribbon4Our RibbonUnderwoodBlack5425.00 8typewriter ribbon5Ribbons & UsUnderwoodBlack15730.47 9typewriter ribbon5Ribbons & UsUnderwoodBlack + Red1428.47 10typewriter ribbon6All You NeedAdlerBlack4420.00 11typewriter ribbon6All You NeedAdlerBlack + Red1630.00 12typewriter ribbon7Ribbons & UsAdlerBlack5424.69 13typewriter ribbon7Ribbons & UsAdlerBlack + Red2730.30 Com esta tabela, você pode obter vários grupos. Por exemplo, você pode calcular o preço médio de um produto pela marca da máquina de escrever. Aqui está a consulta que fará isso: SELECT typewriter_brand, AVG(price) AS average_price FROM typewriter_products GROUP BY typewriter_brand; Esta consulta agrupa os dados pela marca da máquina de escrever e calcula o preço médio. A consulta produzirá esta tabela: typewriter_brandaverage_price Adler26.25 Olympia11.89 Underwood26.77 A saída mostra três tipos de marcas de máquina de escrever e o preço médio do produto para cada máquina de escrever. Ou você pode encontrar o número de fitas disponíveis por cor com esta consulta: SELECT ribbon_color, SUM(units) AS sum_units FROM typewriter_products GROUP BY ribbon_color; O grupo nesta consulta é a cor das fitas. Também utilizo a função agregada SUM() para somar o número de unidades por cor de fita. Aqui está o resultado: ribbon_colorsum_units Black508 Black + Red265 Os dados são agrupados em duas linhas: fita preta e fita preta + fita vermelha. Para cada cor de fita, há um número de unidades disponíveis para venda. Isto é uma prévia do que o GROUP BY faz e como funciona. Como você pode ver, a sintaxe do GROUP BY é relativamente simples. Se você precisar de mais esclarecimentos sobre a sintaxe do GROUP BY, dê uma olhada neste artigo. Como você pode escrever suas próprias perguntas e fazer uso da cláusula GROUP BY? Aqui estão algumas dicas para ajudar você. Passos para usar a cláusula GROUP BY Como usar GROUP BY em SQL? Nesta seção, vou lhe dar uma receita passo a passo. Vamos imaginar que eu quero encontrar o número de registros para cada produto. O primeiro passo para escrever uma consulta deve ser encontrar uma coluna de agrupamento adequada. Neste caso, é product_id. Colocamos esta coluna na cláusula GROUP BY: SELECT … GROUP BY product_id; O segundo passo é escolher a função agregada correta e utilizá-la na declaração SELECT. Como nosso objetivo é encontrar o número de registros, usamos a função COUNT(). Naturalmente, você também precisa especificar a coluna na cláusula FROM: SELECT COUNT(*) FROM typewriter_products GROUP BY product_id; Esta consulta será executada? Claro que sim! Ela retornará esta saída. count 2 2 1 2 2 2 2 Como você pode ver, isto não é muito útil. Todos os produtos têm dois registros, exceto um, mas quais são estes produtos? Nós não temos nenhuma pista! É por isso que o terceiro passo é importante. Nesta etapa, escreva também a coluna de agrupamento no site SELECT: SELECT product_id, COUNT(*) FROM typewriter_products GROUP BY product_id ORDER BY product_id; Agora, a consulta mostrará esta saída. product_idcount 12 22 32 41 52 62 72 Isto é muito mais útil, certo? Agora você sabe que o produto com ID 4 tem apenas uma ocorrência na tabela. Você provavelmente notou que eu usei COUNT(*) nas consultas acima. Esta não é a única maneira de usar essa função agregada. Você também pode aprender sobre todas as opções de uso de COUNT(). Ao comparar as duas consultas acima, você pode ver que é possível usar uma coluna no GROUP BY mas não usá-la em SELECT; o agrupamento ainda funciona. E se você usou a coluna na declaração SELECT, mas não no GROUP BY? Não, você não pode fazer isso. A regra geral é: Se a coluna estiver no SELECT e não for utilizada em uma função agregada, ela deve ser listada na cláusula GROUP BY. Aqui estão mais alguns detalhes sobre esta regra. Outras Dicas para usar GROUP BY em SQL Embora o uso do GROUP BY pareça ser bastante fácil (e é!), há algumas outras dicas e truques que tornarão o seu uso uma experiência muito mais confortável. Use um Identificador Único Ao escolher por qual coluna agrupar, você deve geralmente usar a coluna que identifica de forma única o grupo. Se você não fizer isso, o resultado obtido pode ser enganoso ou simplesmente errado. Por exemplo, vamos mostrar os produtos por marca de máquina de escrever, mas tente agrupar os dados pelo nome do produto. A consulta ... SELECT product_name, typewriter_brand, COUNT(*) AS product_count FROM typewriter_products GROUP BY product_name, typewriter_brand ORDER BY typewriter_brand; ... produzirá a seguinte tabela: product_nametypewriter_brandproduct_count typewriter ribbonAdler4 typewriter ribbonOlympia4 typewriter ribbonUnderwood5 Se você agrupasse os dados desta forma, ficaria com a impressão errada de que existe apenas um produto para cada uma das três marcas de máquinas de escrever - um produto que aparece quatro vezes para as máquinas de escrever Adler e Olympia e cinco vezes para Underwood. E se você usasse a coluna product_id em vez do nome_do_produto? SELECT product_id, typewriter_brand, COUNT(*) AS product_count FROM typewriter_products GROUP BY product_id, typewriter_brand ORDER BY typewriter_brand; Agora você vê que o resultado é um pouco diferente: product_idtypewriter_brandproduct_count 6Adler2 7Adler2 1Olympia2 2Olympia2 3Underwood2 4Underwood1 5Underwood2 Ainda existem produtos para três marcas de máquinas de escrever. Entretanto, agora você sabe que existem dois produtos para Adler e Olympia, ambos aparecendo duas vezes para cada máquina de escrever. Há três produtos para Underwood. Não só isso, mas você também sabe quais produtos eles são. Vejamos este exemplo: SELECT product_id, product_name, typewriter_brand, COUNT(*) AS product_count FROM typewriter_products GROUP BY product_id, product_name, typewriter_brand ORDER BY typewriter_brand; Esta é uma versão ampliada da consulta anterior. Agrupamos novamente por product_id. Para obter o número de ocorrências de produtos, usamos a função COUNT(). Também queremos mais etiquetas, então adicionamos o nome do produto e a marca da máquina de escrever ao SELECT. Como estas colunas aparecem no SELECT, elas também devem aparecer no GROUP BY. Note que todas as colunas o fazem, exceto a que tem a função agregada. Dê uma olhada na saída: product_idproduct_nametypewriter_brandproduct_count 6typewriter ribbonAdler2 7typewriter ribbonAdler2 1typewriter ribbonOlympia2 2typewriter ribbonOlympia2 3typewriter ribbonUnderwood2 4typewriter ribbonUnderwood1 5typewriter ribbonUnderwood2 Você pode ver a saída que dá a imagem mais clara. Existem sete produtos diferentes, mas são todos fitas para máquinas de escrever. Estes produtos são para três marcas de máquinas de escrever. Todos os produtos têm duas ocorrências, exceto o produto nº 4. Agrupamento por valor Nem sempre é necessário agrupar pela coluna de identificação. Também é possível agrupar os dados por valor. Por exemplo, se você quisesse saber quantas unidades existem pela cor da fita, você usaria esta consulta: SELECT ribbon_color, SUM(units) AS units_sum FROM typewriter_products GROUP BY ribbon_color; Aqui utilizamos a cor da fita como critério de agrupamento. A função agregada SUM() totalizará as unidades da seguinte forma: ribbon_colorunits_sum Black508 Black + Red265 A saída mostra que existem 508 fitas pretas e 265 fitas pretas e vermelhas. Se você não estiver familiarizado com a soma dos valores, verifique a função SUM() explicada. As funções MIN() & MAX() também são comumente usadas com GROUP BY. Duas Colunas como o Definidor do Grupo A cláusula GROUP BY permite agrupar os dados por duas ou mais colunas; você já viu isso. Mas também é possível usar duas colunas como o identificador único de um grupo. Por exemplo, a cláusula GROUP BY: SELECT ribbon_color, typewriter_brand, SUM(units) AS units_sum FROM typewriter_products GROUP BY ribbon_color, typewriter_brand ORDER BY typewriter_brand; Nesta consulta, utilizamos as colunas ribbon_color e typewriter_brand para definir um grupo. Cada cor de fita para uma máquina de escrever específica será mostrada apenas uma vez. Para tal grupo definido, calculamos o número de fitas disponíveis: ribbon_colortypewriter_brandunits_sum BlackAdler98 Black + RedAdler43 BlackOlympia185 Black + RedOlympia195 BlackUnderwood225 Black + RedUnderwood27 Agrupamento por uma Expressão Em vez de agrupar apenas por colunas, também é possível agrupar os dados por uma expressão. Vamos dar uma olhada na seguinte consulta: SELECT ribbon_brand, ribbon_color, units*price AS product_value, SUM(units*price) AS product_value_sum FROM typewriter_products GROUP BY ribbon_brand, ribbon_color, units*price ORDER BY ribbon_brand; Aqui selecionamos a marca e a cor da fita. Além disso, também calculamos o valor de cada grupo multiplicando a unidade pelo preço. Em seguida, agrupamos os dados pelas colunas ribbon_brand e ribbon_color. Isto é algo a que você está acostumado. Mas também adicionamos a fórmula para calcular o valor à cláusula GROUP BY. Queremos mostrar apenas valores únicos por marca e cor da fita. Se houver vários dos mesmos valores calculados dentro de um mesmo grupo, eles serão mostrados como uma linha. Para tornar a agregação mais óbvia, acrescentei a soma dos valores do produto. Logo você verá o porquê. ribbon_brandribbon_colorproduct_valueproduct_value_sum All You NeedBlack346.36346.36 All You NeedBlack880.001,760.00 All You NeedBlack + Red327.21327.21 All You NeedBlack + Red480.00960.00 Our RibbonBlack1,350.001,350.00 Ribbons & UsBlack1,201.831,201.83 Ribbons & UsBlack1,333.261,333.26 Ribbons & UsBlack4,783.794,783.79 Ribbons & UsBlack + Red398.58398.58 Ribbons & UsBlack + Red818.10818.10 Ribbons & UsBlack + Red2,227.052,227.05 Pode parecer que esta tabela não está agrupada de forma alguma. Mas vamos dar uma olhada mais de perto. Se os dados não estivessem agrupados, a marca All You Need teria aparecido seis vezes, o mesmo que Ribbons & Us. Mas aparece apenas quatro vezes. Por quê? Porque os valores 880,00 e 480,00 aparecem duas vezes cada um, então eles estão agrupados. Isto é o que a coluna valor_do_produto_sum lhe diz nas filas coloridas. Estas são as únicas linhas em que esta coluna é diferente do valor_do_produto. A linha verde tem uma soma de 1.760,00 porque o valor 880,00 aparece duas vezes. A linha vermelha tem uma soma de 960,00 porque o valor 480,00 aparece duas vezes. Passos para escrever uma consulta com funções de GROUP BY e agregar Você já internalizou GROUP BY através da escrita de todas as perguntas acima. Mas acho que vale a pena ter isto como uma lista separada - a lista de verificação dos passos. Etapa 1: Identifique a(s) coluna(s) de agrupamento, ou seja, uma coluna ou colunas pelas quais você deseja agrupar os dados. Depois de identificá-la, coloque-a na cláusula GROUP BY. Etapa 2: Dependendo da métrica que você deseja calcular, escolha a função agregada apropriada e use-a na declaração SELECT. Etapa 3: Utilize a coluna de agrupamento na instrução SELECT. Dessa forma, você obterá etiquetas de dados para cada grupo, não apenas a saída da função agregada. Nenhum usuário SQL pode evitar o uso de GROUP BY Nenhum usuário SQL conhecido por mim conseguiu viver uma vida SQL de sucesso e escrever consultas sem o GROUP BY. É impossível! Então, por que não praticar GROUP BY e outras expressões e funções SQL? A escolha sábia seria nossa Curso de Práticas em SQL. Ele lhe oferece a oportunidade de praticar todas as diferentes formas de utilização do GROUP BY abordadas no artigo. Alguns outros recursos úteis para exemplos do GROUP BY estão disponíveis em nosso blog; o conceito também aparece freqüentemente em perguntas de entrevistas de emprego SQL. Tags: sql group by