Nas consultas SQL, usamos a cláusula Group by para aplicar funções agregadas.
- Mas qual é o objetivo por trás do uso de valor numérico em vez do nome da coluna com a cláusula Agrupar por? Por exemplo: Agrupe por 1.
Nas consultas SQL, usamos a cláusula Group by para aplicar funções agregadas.
Respostas:
Isso é realmente uma coisa muito ruim para se fazer IMHO, e não é suportado na maioria das outras plataformas de banco de dados.
As razões pelas quais as pessoas fazem isso:
As razões são ruins:
não é auto-documentado - alguém precisará analisar a lista SELECT para descobrir o agrupamento. Na verdade, seria um pouco mais claro no SQL Server, que não suporta agrupamentos de quem sabe o que vai acontecer como o MySQL.
é frágil - alguém entra e altera a lista SELECT porque os usuários corporativos queriam uma saída de relatório diferente e agora sua saída está uma bagunça. Se você tivesse usado nomes de colunas no GROUP BY, a ordem na lista SELECT seria irrelevante.
O SQL Server oferece suporte a ORDER BY [ordinal]; Aqui estão alguns argumentos paralelos contra seu uso:
O MySQL permite que você faça GROUP BY
aliases ( Problemas com aliases de colunas ). Isso seria muito melhor do que fazer GROUP BY
com números.
column number
diagramas SQL . Uma linha diz: Classifica o resultado pelo número da coluna fornecida ou por uma expressão. Se a expressão for um único parâmetro, o valor será interpretado como um número de coluna. Os números negativos da coluna invertem a ordem de classificação.O Google tem muitos exemplos de como usá-lo e por que muitos pararam de usá-lo.
Para ser honesto com você, eu não usei números das colunas para ORDER BY
e GROUP BY
desde 1996 (eu estava fazendo Oracle PL / SQL Desenvolvimento na época). O uso de números de coluna é realmente para veteranos e a compatibilidade com versões anteriores permite que esses desenvolvedores usem o MySQL e outros RDBMSs que ainda o permitem.
Considere o caso abaixo:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Apps | 1 |
| 2016-05-31 | Applications | 1 |
| 2016-05-31 | Applications | 1 |
| 2016-05-31 | Apps | 1 |
| 2016-05-31 | Videos | 1 |
| 2016-05-31 | Videos | 1 |
| 2016-06-01 | Apps | 3 |
| 2016-06-01 | Applications | 4 |
| 2016-06-01 | Videos | 2 |
| 2016-06-01 | Apps | 2 |
+------------+--------------+-----------+
Você precisa descobrir o número de downloads por serviço por dia, considerando aplicativos e aplicativos como o mesmo serviço. O agrupamento por date, services
resultaria Apps
e Applications
seria considerado um serviço separado.
Nesse caso, a consulta seria:
select date, services, sum(downloads) as downloads
from test.zvijay_test
group by date,services
E saída:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications | 2 |
| 2016-05-31 | Apps | 2 |
| 2016-05-31 | Videos | 2 |
| 2016-06-01 | Applications | 4 |
| 2016-06-01 | Apps | 5 |
| 2016-06-01 | Videos | 2 |
+------------+--------------+-----------+
Mas não é isso que você deseja, pois o agrupamento de aplicativos e aplicativos é o requisito. Então o que nós podemos fazer?
Uma maneira é substituir Apps
pelo Applications
uso de uma CASE
expressão ou IF
função e agrupá-los em serviços como:
select
date,
if(services='Apps','Applications',services) as services,
sum(downloads) as downloads
from test.zvijay_test
group by date,services
Mas isso ainda agrupa serviços considerando Apps
e Applications
como serviços diferentes e fornece a mesma saída que anteriormente:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications | 2 |
| 2016-05-31 | Applications | 2 |
| 2016-05-31 | Videos | 2 |
| 2016-06-01 | Applications | 4 |
| 2016-06-01 | Applications | 5 |
| 2016-06-01 | Videos | 2 |
+------------+--------------+-----------+
O agrupamento sobre o número de uma coluna permite agrupar dados em uma coluna com alias.
select
date,
if(services='Apps','Applications',services) as services,
sum(downloads) as downloads
from test.zvijay_test
group by date,2;
E, assim, fornecendo a saída desejada, como abaixo:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications | 4 |
| 2016-05-31 | Videos | 2 |
| 2016-06-01 | Applications | 9 |
| 2016-06-01 | Videos | 2 |
+------------+--------------+-----------+
Eu já li muitas vezes que essa é uma maneira lenta de escrever consultas ou agrupar sobre uma coluna com alias não funciona no MySQL, mas essa é a maneira de agrupar colunas com alias.
Essa não é a maneira preferida de escrever consultas, use-a apenas quando você realmente precisar agrupar sobre uma coluna com alias.
Não há motivo válido para usá-lo. É simplesmente um atalho lento, especialmente projetado para dificultar a algum desenvolvedor pressionado descobrir seu agrupamento ou classificação posteriormente ou permitir que o código falhe miseravelmente quando alguém altera a ordem das colunas. Seja atencioso com seus colegas desenvolvedores e não faça isso.
Isso é trabalhado para mim. O código agrupa as linhas em até 5 grupos.
SELECT
USR.UID,
USR.PROFILENAME,
(
CASE
WHEN MOD(@curRow, 5) = 0 AND @curRow > 0 THEN
@curRow := 0
ELSE
@curRow := @curRow + 1
/*@curRow := 1*/ /*AND @curCode := USR.UID*/
END
) AS sort_by_total
FROM
SS_USR_USERS USR,
(
SELECT
@curRow := 0,
@curCode := ''
) rt
ORDER BY
USR.PROFILENAME,
USR.UID
O resultado será o seguinte
SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2;
SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2,3;
Considere as consultas acima: Agrupar por 1 significa agrupar pela primeira coluna e agrupar por 1,2 significa agrupar pela primeira e segunda coluna e agrupar por 1,2,3 significa agrupar pela primeira segunda e terceira coluna. Por exemplo:
esta imagem mostra as duas primeiras colunas agrupadas por 1,2, isto é, não está considerando os diferentes valores de dep_date para encontrar a contagem (para calcular a contagem, todas as combinações distintas das duas primeiras colunas são levadas em consideração), enquanto a segunda consulta resulta em
imagem. Aqui estão considerando todas as três primeiras colunas e existem valores diferentes para encontrar a contagem, ou seja, é agrupado pelas três primeiras colunas (para calcular a contagem, todas as combinações distintas das três primeiras colunas são levadas em consideração).
order by 1
apenas quando estiver sentado nomysql>
prompt. No código, useORDER BY id ASC
. Observe o caso, o nome explícito do campo e a direção explícita da ordem.