SQL 쿼리에서 Group by 1과 Group by 1,2,3을 사용하는 이유는 무엇입니까?


26

SQL 쿼리에서는 Group by 절을 사용하여 집계 함수를 적용합니다.

  • 그러나 Group by 절에서 열 이름 대신 숫자 값을 사용하는 목적은 무엇입니까? 예를 들면 다음과 같습니다. Group by 1

3
프롬프트에 order by 1앉아있을 때만 사용하십시오 mysql> . 코드에서을 사용하십시오 ORDER BY id ASC. 대소 문자, 명시 적 필드 이름 및 명시 적 순서 방향에 유의하십시오.
dotancohen

답변:


28

이것은 실제로 IMHO를하기에는 정말 나쁜 일이며, 대부분의 다른 데이터베이스 플랫폼에서는 지원되지 않습니다.

사람들이하는 이유 :

  • 그들은 게으르다 -사람들이 더 많은 문자 코드를 얻기 위해 40 밀리 초를 더 입력하지 않고 간결한 코드를 작성하여 생산성이 향상되었다고 생각하는 이유를 모르겠습니다.

나쁜 이유 :

  • 자체 문서화가 아닙니다. 누군가 그룹화를 파악하기 위해 SELECT 목록을 구문 분석해야합니다. 실제로는 SQL Server에서 조금 더 명확 할 것인데, MySQL과 같이 카우보이를 누가 알겠는가?

  • 그것은 취성의 - 사람이 와서 비즈니스 사용자가 다른 보고서 출력을 원하기 때문에 SELECT 목록을 변경하고 지금 출력이 엉망이다. GROUP BY에서 열 이름을 사용한 경우 SELECT 목록의 순서는 관련이 없습니다.

SQL Server는 ORDER BY [ordinal]을 지원합니다. 다음은 사용에 대한 몇 가지 병렬 주장입니다.


9

MySQL을 사용하면 GROUP BY별칭 ( 열 별칭 문제 )을 사용할 수 있습니다. 이것은 GROUP BY숫자로 하는 것보다 훨씬 낫습니다 .

구글은 그것을 사용하는 많은 예를 가지고 있으며 왜 많은 사람들이 그것을 사용을 중단했는지.

솔직히 말해서 1996 년 ORDER BY과 그 GROUP BY이후로 열 번호를 사용하지 않았습니다 (당시 Oracle PL / SQL Development를하고있었습니다). 열 번호를 사용하는 것은 실제로 오래된 타이머를위한 것이며 이전 버전과의 호환성을 통해 이러한 개발자는 여전히 MySQL 및 기타 RDBMS를 사용할 수 있습니다.


8

아래의 경우를 고려하십시오.

+------------+--------------+-----------+
| 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 |
+------------+--------------+-----------+

앱과 애플리케이션을 동일한 서비스로 간주하여 매일 서비스 당 다운로드 수를 확인했습니다. 에 의해 그룹화 date, services초래 Apps하고 Applications별도의 서비스를 해보십시오.

이 경우 쿼리는 다음과 같습니다.

 select date, services, sum(downloads) as downloads
 from test.zvijay_test
 group by date,services

그리고 출력 :

+------------+--------------+-----------+
| 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 |
+------------+--------------+-----------+

그러나 응용 프로그램과 응용 프로그램을 그룹화해야하기 때문에 이것이 원하는 것은 아닙니다. 그래서 우리가 뭘 할 수 있지?

한 가지 방법은 교체하는 것입니다 Apps함께 Applications사용하여 CASE표현하거나 IF같은 서비스를 통해 그들을 분류하는 기능을하고 :

select 
  date,
  if(services='Apps','Applications',services) as services,
  sum(downloads) as downloads
from test.zvijay_test 
group by date,services

그러나 여전히 서비스를 고려 Apps하고 Applications다른 서비스로 그룹화 하고 이전과 동일한 출력을 제공합니다.

+------------+--------------+-----------+
| 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 |
+------------+--------------+-----------+

열 번호를 그룹화하면 별칭이 지정된 열에서 데이터를 그룹화 할 수 있습니다.

select
  date,
  if(services='Apps','Applications',services) as services,
  sum(downloads) as downloads
from test.zvijay_test
group by date,2;

따라서 아래와 같이 원하는 출력을 제공합니다.

+------------+--------------+-----------+
| date       | services     | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications |         4 |
| 2016-05-31 | Videos       |         2 |
| 2016-06-01 | Applications |         9 |
| 2016-06-01 | Videos       |         2 |
+------------+--------------+-----------+

필자는 이것이 게으른 쿼리 작성 방법 또는 별칭 열을 그룹화하는 것이 MySQL에서 작동하지 않는다는 것을 여러 번 읽었지만 별칭 열을 그룹화하는 방법입니다.

이 방법은 쿼리를 작성하는 기본 방법이 아니며 별칭 열을 실제로 그룹화해야 할 때만 사용하십시오.


" 그러나 여전히 앱과 애플리케이션을 다른 서비스로 고려하는 서비스를 그룹화하고 이전과 동일한 결과를 제공합니다 ." 별명에 다른 (충돌하지 않는) 이름을 선택한 경우이 문제가 해결되지 않습니까?
Daddy32

3

그것을 사용할 유효한 이유가 없습니다. 이것은 엄청나게 억 누른 개발자가 나중에 그룹화 또는 정렬을 알아 내지 못하거나 누군가가 열 순서를 변경할 때 코드가 비참하게 실패하지 않도록 특별히 설계된 게으른 바로 가기입니다. 동료 개발자를 배려하고 그렇게하지 마십시오.


0

이것은 나를 위해 일했습니다. 이 코드는 행을 최대 5 개의 그룹으로 그룹화합니다.

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

결과는 다음과 같습니다

여기에 이미지 설명을 입력하십시오


0
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;

위의 쿼리를 고려하십시오. 그룹 별 1은 첫 번째 열을 기준으로 그룹화하고 1,2를 기준으로 그룹화하면 첫 번째 및 두 번째 열을 기준으로 그룹화하고 1,2,3을 기준으로 그룹화하면 첫 번째 두 번째 및 세 번째 열 기준으로 그룹화됩니다. 예를 들어 :

1,2로 그룹화

이 이미지는 첫 번째 두 열을 1,2로 그룹화하여 표시합니다. 즉, 카운트를 찾기 위해 dep_date의 다른 값을 고려하지 않습니다 (첫 번째 두 열의 모든 별개의 조합을 계산하기 위해 계산). 두 번째 쿼리 결과는 1,2,3으로 그룹화

영상. 여기서는 처음 세 개의 열을 모두 고려하고 카운트를 찾는 다른 값이 있습니다. 즉, 첫 번째 세 개의 열을 기준으로 그룹화합니다 (처음 세 열의 모든 별개의 조합을 고려하기 위해 계산합니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.