[SQL] MySQL의 GROUP BY 두 개의 열
SQLMySQL의 GROUP BY 두 개의 열
여기에 여러 열을 기준으로 그룹에 노력하고있어 - 각 테이블에 하나씩. 내가 함께 현재의 포트폴리오와 현금을 추가하여 각 클라이언트에 대한 상위 포트폴리오 값을 찾으려면 시나리오입니다하지만 각 클라이언트에 대해 최고 포트폴리오를 필요로하므로 클라이언트는 하나 개 이상의 포트폴리오를 가질 수있다.
지금이 순간, 코드와 I (이것은 클라이언트 ID로 그룹화 아니에요) 그들의 최고 포트폴리오의 각각에 대해 같은 클라이언트를 여러 번 받고 있어요 아래.
SELECT clients.id, clients.name, portfolios.id, SUM ( portfolios.portfolio + portfolios.cash ) AS total
FROM clients, portfolios
WHERE clients.id = portfolios.client_id
GROUP BY portfolios.id, clients.id
ORDER BY total DESC
LIMIT 30
해결법
-
==============================
1.먼저, 테스트 데이터를 만들어 보자 :
먼저, 테스트 데이터를 만들어 보자 :
create table client (client_id integer not null primary key auto_increment, name varchar(64)); create table portfolio (portfolio_id integer not null primary key auto_increment, client_id integer references client.id, cash decimal(10,2), stocks decimal(10,2)); insert into client (name) values ('John Doe'), ('Jane Doe'); insert into portfolio (client_id, cash, stocks) values (1, 11.11, 22.22), (1, 10.11, 23.22), (2, 30.30, 40.40), (2, 40.40, 50.50);
당신이 포트폴리오 ID가 필요하지 않은 경우, 그것은 쉬운 것입니다 :
select client_id, name, max(cash + stocks) from client join portfolio using (client_id) group by client_id +-----------+----------+--------------------+ | client_id | name | max(cash + stocks) | +-----------+----------+--------------------+ | 1 | John Doe | 33.33 | | 2 | Jane Doe | 90.90 | +-----------+----------+--------------------+
당신이 포트폴리오 ID가 필요하기 때문에 상황은 더 복잡해진다. 의이 단계에서 할 수 있습니다. 첫째, 우리는 하위 쿼리를 쓸 것이다 그 반환 각 클라이언트의 최대 포트폴리오의 가치를 :
select client_id, max(cash + stocks) as maxtotal from portfolio group by client_id +-----------+----------+ | client_id | maxtotal | +-----------+----------+ | 1 | 33.33 | | 2 | 90.90 | +-----------+----------+
그런 다음 우리는 포트폴리오 테이블을 쿼리,하지만 그 포트폴리오를 클라이언트에 대한 최대 인의 총 가치를 유지하기 위해 이전의 하위 쿼리에 조인 사용합니다 :
select portfolio_id, cash + stocks from portfolio join (select client_id, max(cash + stocks) as maxtotal from portfolio group by client_id) as maxima using (client_id) where cash + stocks = maxtotal +--------------+---------------+ | portfolio_id | cash + stocks | +--------------+---------------+ | 5 | 33.33 | | 6 | 33.33 | | 8 | 90.90 | +--------------+---------------+
마지막으로, 우리는 각 클라이언트의 이름을 포함하기 위해 (당신처럼) 클라이언트 테이블에 가입 할 수 있습니다 :
select client_id, name, portfolio_id, cash + stocks from client join portfolio using (client_id) join (select client_id, max(cash + stocks) as maxtotal from portfolio group by client_id) as maxima using (client_id) where cash + stocks = maxtotal +-----------+----------+--------------+---------------+ | client_id | name | portfolio_id | cash + stocks | +-----------+----------+--------------+---------------+ | 1 | John Doe | 5 | 33.33 | | 1 | John Doe | 6 | 33.33 | | 2 | Jane Doe | 8 | 90.90 | +-----------+----------+--------------+---------------+
참고이 반환 홍길동에 대한 두 개의 행 그는 동일한 총 값을 갖는 두 개의 포트폴리오를 가지고 있기 때문에. 이를 방지 및 GROUP BY 절에 임의의 상위 포트폴리오, 태그를 선택합니다 :
select client_id, name, portfolio_id, cash + stocks from client join portfolio using (client_id) join (select client_id, max(cash + stocks) as maxtotal from portfolio group by client_id) as maxima using (client_id) where cash + stocks = maxtotal group by client_id, cash + stocks +-----------+----------+--------------+---------------+ | client_id | name | portfolio_id | cash + stocks | +-----------+----------+--------------+---------------+ | 1 | John Doe | 5 | 33.33 | | 2 | Jane Doe | 8 | 90.90 | +-----------+----------+--------------+---------------+
-
==============================
2.의지 작업하여 그룹에 CONCAT를 사용하여
의지 작업하여 그룹에 CONCAT를 사용하여
SELECT clients.id, clients.name, portfolios.id, SUM ( portfolios.portfolio + portfolios.cash ) AS total FROM clients, portfolios WHERE clients.id = portfolios.client_id GROUP BY CONCAT(portfolios.id, "-", clients.id) ORDER BY total DESC LIMIT 30
from https://stackoverflow.com/questions/2183373/mysql-group-by-two-columns by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] UTF8으로 라틴 데이터를 변환 MYSQL (0) | 2020.06.20 |
---|---|
[SQL] 어떻게 각 키 값에 대한 가장 최근의 타임 스탬프 행을 선택할 수 있습니까? (0) | 2020.06.20 |
[SQL] 내가 두 테이블을 함께 매핑 테이블의 이름을 지정해야합니까? [닫은] (0) | 2020.06.20 |
[SQL] 어떻게 오류 메시지의 실제 저장 프로 시저의 줄 번호를받을 수 있나요? (0) | 2020.06.20 |
[SQL] VARCHAR SQL에 INT로 변환 (0) | 2020.06.20 |