SQL 쿼리에서는 Group by 절을 사용하여 집계 함수를 적용합니다.
- 그러나 Group by 절에서 열 이름 대신 숫자 값을 사용하는 목적은 무엇입니까? 예를 들면 다음과 같습니다. Group by 1
SQL 쿼리에서는 Group by 절을 사용하여 집계 함수를 적용합니다.
답변:
이것은 실제로 IMHO를하기에는 정말 나쁜 일이며, 대부분의 다른 데이터베이스 플랫폼에서는 지원되지 않습니다.
사람들이하는 이유 :
나쁜 이유 :
자체 문서화가 아닙니다. 누군가 그룹화를 파악하기 위해 SELECT 목록을 구문 분석해야합니다. 실제로는 SQL Server에서 조금 더 명확 할 것인데, MySQL과 같이 카우보이를 누가 알겠는가?
그것은 취성의 - 사람이 와서 비즈니스 사용자가 다른 보고서 출력을 원하기 때문에 SELECT 목록을 변경하고 지금 출력이 엉망이다. GROUP BY에서 열 이름을 사용한 경우 SELECT 목록의 순서는 관련이 없습니다.
SQL Server는 ORDER BY [ordinal]을 지원합니다. 다음은 사용에 대한 몇 가지 병렬 주장입니다.
MySQL을 사용하면 GROUP BY
별칭 ( 열 별칭 문제 )을 사용할 수 있습니다. 이것은 GROUP BY
숫자로 하는 것보다 훨씬 낫습니다 .
column number
SQL 다이어그램에 있습니다. 한 줄의 말 : 주어진 열 번호 또는 표현식을 기준으로 결과를 정렬합니다. 표현식이 단일 매개 변수 인 경우 값은 열 번호로 해석됩니다. 음수 열 번호는 정렬 순서를 반대로합니다.구글은 그것을 사용하는 많은 예를 가지고 있으며 왜 많은 사람들이 그것을 사용을 중단했는지.
솔직히 말해서 1996 년 ORDER BY
과 그 GROUP BY
이후로 열 번호를 사용하지 않았습니다 (당시 Oracle PL / SQL Development를하고있었습니다). 열 번호를 사용하는 것은 실제로 오래된 타이머를위한 것이며 이전 버전과의 호환성을 통해 이러한 개발자는 여전히 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 |
+------------+--------------+-----------+
그러나 응용 프로그램과 응용 프로그램을 그룹화해야하기 때문에 이것이 원하는 것은 아닙니다. 그래서 우리가 뭘 할 수 있지?
한 가지 방법은 교체하는 것입니다 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에서 작동하지 않는다는 것을 여러 번 읽었지만 별칭 열을 그룹화하는 방법입니다.
이 방법은 쿼리를 작성하는 기본 방법이 아니며 별칭 열을 실제로 그룹화해야 할 때만 사용하십시오.
이것은 나를 위해 일했습니다. 이 코드는 행을 최대 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
. 대소 문자, 명시 적 필드 이름 및 명시 적 순서 방향에 유의하십시오.