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

  • 하지만 Group by 절에서 열 이름 대신 숫자 값을 사용하는 이유는 무엇입니까? 예 : 1로 그룹화

댓글

  • 앉은 상태에서만 order by 1 사용 mysql> 프롬프트에서. 코드에서는 ORDER BY id ASC를 사용합니다. 대소 문자, 명시 적 필드 이름 및 명시 적 순서 방향에 유의하십시오.

답변

실제로는 매우 나쁩니다. IMHO를 수행해야하며 대부분의 다른 데이터베이스 플랫폼에서는 지원되지 않습니다.

사람들이 그렇게하는 이유 :

  • they “re lazy -사람들이 훨씬 더 많은 문자 코드를 얻기 위해 40 밀리 초를 추가로 입력하는 대신 간결한 코드를 작성함으로써 생산성이 향상되었다고 생각하는 이유를 모르겠습니다.

나쁜 이유 :

  • 자체 문서화가 아닙니다. -누군가 그룹화를 파악하기 위해 SELECT 목록을 구문 분석해야합니다. 실제로 카우보이를 지원하지 않는 SQL Server에서는 좀 더 명확합니다. MySQL과 같은 knows-what-will-happen 그룹화입니다.

  • 깨지기 쉽습니다. -누군가 들어 와서 SELECT 목록을 변경합니다. 비즈니스 사용자는 다른 보고서 출력을 원했고 이제 출력이 엉망입니다. GROUP BY에서 열 이름을 사용한 경우 SELECT 목록의 순서는 무관합니다.

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

Answer

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

Google에는 사용 사례가 많고 사용을 중단 한 이유도 많습니다.

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

답변

아래 사례 고려 :

+------------+--------------+-----------+ | 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별로 그룹화하면 AppsApplications가 별도의 서비스로 간주됩니다.

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

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

하지만 애플리케이션과 앱을 그룹화해야하기 때문에 원하는 것이 아닙니다. 그렇다면 우리는 무엇을 할 수 있습니까?

한 가지 방법은 iv id = “를 사용하여 AppsApplications로 바꾸는 것입니다. 143a6dbc27 “>

표현식 또는IF함수를 사용한 다음 서비스를 통해 다음과 같이 그룹화 :

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

그러나 이것은 여전히 AppsApplications를 다른 서비스로 간주하는 서비스를 그룹화하고 이전과 동일한 출력을 제공합니다.

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

I “ve 쿼리를 작성하는 게으른 방법이거나 별칭이 지정된 열에 대한 그룹화는 MySQL에서 작동하지 않지만 별칭이 지정된 열에 대한 그룹화 방법입니다.

이것은 쿼리 작성에 선호되는 방법이 아닙니다. 별칭이 지정된 열을 기준으로 그룹화해야합니다.

댓글

  • 하지만 여전히 앱과 애플리케이션을 다른 서비스로 간주하는 서비스를 그룹화하고 이전과 동일한 출력을 제공합니다 “.’ ‘ 별명에 대해 다른 (충돌하지 않는) 이름을 선택했다면이 문제가 해결되지 않습니까?
  • @ Daddy32 정확히 제 생각입니다. 또는 한 번 더 중첩 (선택 후 그룹화)

답변

사용할 유효한 이유가 없습니다. 일부 강압적 인 개발자가 나중에 그룹화 또는 정렬을 파악하기 어렵게하거나 누군가가 열 순서를 변경할 때 코드가 비참하게 실패 할 수 있도록 특별히 설계된 게으른 바로 가기입니다. 동료 개발자를 배려하고 그렇게하지 마십시오.

답변

이것은 저에게 효과적입니다. 코드 그룹은 최대 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 

결과는 다음과 같습니다.

여기에 이미지 설명 입력

답변

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

이미지별로 그룹화합니다. 여기에서는 처음 세 열을 모두 고려하고 개수를 찾기 위해 다른 값이 있습니다. 즉, 처음 세 열을 모두 기준으로 그룹화합니다 (처음 세 열의 모든 고유 조합을 계산하기 위해 고려 됨).

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다