SQL 쿼리에서 Group by 절을 사용하여 집계 함수를 적용합니다.
- 하지만 Group by 절에서 열 이름 대신 숫자 값을 사용하는 이유는 무엇입니까? 예 : 1로 그룹화
댓글
답변
실제로는 매우 나쁩니다. 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
하는 것보다 훨씬 낫습니다.
- 아직도 가르치는 사람들도 있습니다.
- 일부는 SQL 다이어그램에
column number
가 있습니다 . 한 줄은 다음과 같이 말합니다. 주어진 열 번호 또는 표현식을 기준으로 결과를 정렬합니다. 표현식이 단일 매개 변수 인 경우 값은 열 번호로 해석됩니다. 음수 열 번호는 정렬 순서를 반대로합니다. - Apache는 SQL Server에서 사용하기 때문에 더 이상 사용되지 않습니다.
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
별로 그룹화하면 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 | +------------+--------------+-----------+
하지만 애플리케이션과 앱을 그룹화해야하기 때문에 원하는 것이 아닙니다. 그렇다면 우리는 무엇을 할 수 있습니까?
한 가지 방법은 iv id = “를 사용하여 Apps
를 Applications
로 바꾸는 것입니다. 143a6dbc27 “>
표현식 또는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 | +------------+--------------+-----------+
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로 그룹화 된 처음 두 열을 보여줍니다. 즉, dep_date의 다른 값을 고려하지 않고 카운트를 찾습니다 (처음 두 열의 모든 고유 조합을 고려하여 계산). 두 번째 쿼리는
이미지별로 그룹화합니다. 여기에서는 처음 세 열을 모두 고려하고 개수를 찾기 위해 다른 값이 있습니다. 즉, 처음 세 열을 모두 기준으로 그룹화합니다 (처음 세 열의 모든 고유 조합을 계산하기 위해 고려 됨).
order by 1
사용mysql>
프롬프트에서. 코드에서는ORDER BY id ASC
를 사용합니다. 대소 문자, 명시 적 필드 이름 및 명시 적 순서 방향에 유의하십시오.