2010-04-21 3 views
3

"Name", "City"및 "Occupation"이라는 3 개의 채워진 열이있는 테이블이 있습니다. 같은 직업에있는 사람의 수를 포함하는 동일한 테이블에 새 열을 만들고 싶습니다.여러 열로 그룹화 된 SQL Count 쿼리

"Name" | "City" | "Occupation" | "Number" 
--------------------------------------- 
Amy | Berlin | Plumber  | 2 
Bob | Berlin | Plumber  | 2 
Carol | Berlin | Lawyer  | 1 
David | London | Plumber  | 1 

가 어떻게 새 열을 생성하는 SQL 쿼리처럼 보이도록해야합니까 :

"Name" | "City" | "Occupation" 
------------------------------ 
Amy | Berlin | Plumber 
Bob | Berlin | Plumber 
Carol | Berlin | Lawyer 
David | London | Plumber 

나는 포함하는 테이블을 갖고 싶어? 나중에 실제로 액세스 할 수있는 데이터베이스에 새 열을 실제로 만들고 싶습니다.

+0

I :; 스키마를 변경해야합니다 (그리고 난 당신이 당신이 그것을 필요로 절대적으로 확실하지 않으면 denormalisation의이 종류를 권하고 싶지 않다 의견을 참조), 당신은 UPDATE와 함께 할 수있는 마이클의 부속 선택에 가입 이유를 읽으십시오. 당신은 질의를하고있었습니다 ... 진지하게! 위의 테이블에 – thecoshman

+0

을 입력하면 행이 가로로 이동하고 세로로 이동합니다. 예를 들어 "amy - berlin - plumber"는 행이고 "Name", "City"및 "Occupation"은 열입니다 –

답변

1

간단한 자체 조인 : Name에 기본 키가

SELECT t0.Name, t0.City, t0.Occupation, COUNT(*) AS Number 
FROM sometable AS t0 
JOIN sometable AS t1 ON t1.Occupation=t0.Occupation 
GROUP BY t0.Name, t0.City, t0.Occupation 

경우 수있는 다른 열이에 대한 기능 종속성이 것이기 때문에 혼자 대신하여 단지 그룹. 물론 Name은 일반적으로 매우 좋은 기본 키가 아닙니다.

(당신이 총보다는 일을 다른명의 수를 원하는 경우 COUNT(*)-1을해야 할 수도 있습니다 그것은 불분명;.. 당신의 예제에서 숫자는 어느 쪽이든을 추가하지 마십시오)

당신이 만약

ALTER TABLE sometable ADD COLUMN Number INTEGER NOT NULL; 
UPDATE sometable AS t0 JOIN (
    SELECT Occupation, COUNT(*) AS Number 
    FROM sometable 
    GROUP BY Occupation 
) AS t1 ON t1.Occupation=t0.Occupation 
SET t0.Number= t1.Number; 
+0

고맙습니다. – Christian

+2

조기 최적화 : 필요에 따라 스키마를 변경하지 마세요. 'Occupation'에 대한 인덱스를 사용하면 매우 빠르며, 비슷한 자체 조인을 할 수 있습니다. - 약 5 초에 500k 게시물의 웹 포럼 데이터베이스를 통한 쿼리 - 마이클의 쿼리는 더 빠릅니다 (LIMITed 결과가 더 느리다하더라도). 데이터베이스에서 정확히 무엇을 얻었는지에 따라 다르지만 적합한 인덱스를 모두 사용합니다. – bobince

+0

데이터베이스에 20,000,000 개의 항목이 있는데 쿼리를 100,000 개 만들려고합니다. 성능이 필요합니다. – Christian

3
select tbl.name, tbl.city, tbl.occupation, x.number 
from tbl 
join 
(
    select occupation, count(*) as number 
    from tbl 
    group by occupation 
) as x on x.occupation = tbl.occupation