2013-01-28 2 views
3

SQL을 처음 사용합니다. 간단한 SQL 솔루션에 대한 행/열에 동일한 데이터,이 경우에는 우편 번호를 포함하는 행에 대한 찾고 있어요. 예를 들어, 데이터의 모양은 다음과 같습니다SQL 열/행 그룹화

state, county, city, zip, count 

"CA","ALAMEDA","HAYWARD","94541",5371 
"CA","ALAMEDA","HAYWARD","94542",2209 
"CA","ALAMEDA","HAYWARD","94544",7179 
"CA","ALAMEDA","HAYWARD","94545",4209 
"CA","ALAMEDA","CASTRO VALLEY","94546",7213 
"CA","ALAMEDA","HAYWARD","94546",37 
"CA","ALAMEDA","LIVERMORE","94550",9809 
"CA","ALAMEDA","LIVERMORE","94551",6558 
"CA","ALAMEDA","CASTRO VALLEY","94552",3121 
"CA","ALAMEDA","HAYWARD","94552",12 
"CA","ALAMEDA","FREMONT","94555",5392

내가 같이 할 데이터와 끝까지 싶습니다

state, county, city, zip, count 

"CA","ALAMEDA","HAYWARD","94541",5371 
"CA","ALAMEDA","HAYWARD","94542",2209 
"CA","ALAMEDA","HAYWARD","94544",7179 
"CA","ALAMEDA","HAYWARD","94545",4209 
"CA","ALAMEDA","CASTRO VALLEY/HAYWARD","94546",7250 
"CA","ALAMEDA","LIVERMORE","94550",9809 
"CA","ALAMEDA","LIVERMORE","94551",6558 
"CA","ALAMEDA","CASTRO VALLEY HAYWARD","94552",3133 
"CA","ALAMEDA","FREMONT","94555",5392

당신은 데이터가되었습니다 두 행에있는 것을 볼 수 있습니다 결합 또는 합계. 똑같은 우편 번호를 포함하는 행의 경우 도시 이름 (도시 이름)이 도시 열에 나타나고 개수는 각 행의 개수 합계입니다.

SQL을 사용하여이 작업을 수행 할 수있는 방법이 있습니까? 두 개의 서로 다른 SQL 문이 필요하더라도 괜찮습니다.

+4

당신의 DBMS 무엇입니까? – Kermit

답변

2

SQL Server를 사용하면 FOR XML을 사용하여 원하는 결과를 얻을 수 있습니다.

select distinct t.state,t.county,t.zip,t2.sumcount, 
STUFF(
     (
      SELECT '/' + city AS [text()] 
      FROM mytable t3 
      WHERE t.zip = t3.zip 
      FOR XML PATH('') 
     ), 1, 1, '') AS ColList 
from mytable t 
    join (select zip, sum(count) as sumcount 
     from mytable 
     group by zip) t2 on t.zip=t2.zip 

그리고 일부는 SQL Fiddle입니다.

당신이 MySQL을 사용하는 경우, GROUP_CONCAT를 사용하여 볼 :

select distinct t.state,t.county,t.zip,t2.sumcount, 
GROUP_CONCAT(t.city) as cities 
from mytable t 
    join (select zip, sum(count) as sumcount 
     from mytable 
     group by zip) t2 on t.zip=t2.zip 
GROUP BY t.state,t.county,t.zip,t2.sumcount 

그리고 더 Fiddle을.

행운을 빈다.

0

나는 실제로 카운트를 얻고 중복 항목을 피하기 위해 sgeddes의 뛰어난 답변을 수정하고 테스트 스크립트를 추가하여 지원할 수 있도록 지원 스크립트를 추가했습니다. 이것은 SQL Server를 가정합니다.

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'MYTABLE') BEGIN 
    drop table MYTABLE; 
END; 
go 

create table MYTABLE 
(
    state nvarchar(2) 
,county nvarchar(100) 
,city nvarchar(100) 
,zip nvarchar(10) 
) 
go 

insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','HAYWARD','94541'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','HAYWARD','94541'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','HAYWARD','94544'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','HAYWARD','94545'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','CASTRO VALLEY','94546'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','CASTRO VALLEY','94546'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','CASTRO VALLEY','94546'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','CASTRO VALLEY','94546'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','CASTRO VALLEY','94546'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','HAYWARD','94546'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','HAYWARD','94546'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','HAYWARD','94546'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','HAYWARD','94546'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','LIVERMORE','94550'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','LIVERMORE','94551'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','CASTRO VALLEY','94552'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','HAYWARD','94552'); 
insert into MYTABLE(state,county,city,zip) values('CA','ALAMEDA','FREMONT','94555'); 

select distinct 
    t.state 
,t.county 
,t.zip 
,t2.sumcount 
,STUFF((
     SELECT distinct '/' + city AS [text()] 
     FROM mytable t3 
     WHERE t.zip = t3.zip 
     FOR XML PATH('') 
     ), 1, 1, '') AS ColList 
from 
    mytable t 
    inner join 
    (
    select zip, sum(count) as sumcount 
    from 
    (
    select zip,count(*) as count 
    from mytable 
    group by zip 
    ) x 
    group by zip 
) t2 
    on t.zip=t2.zip 

출력은 다음과 같습니다

state county zip sumcount ColList 
CA ALAMEDA 94541 2 HAYWARD 
CA ALAMEDA 94544 1 HAYWARD 
CA ALAMEDA 94545 1 HAYWARD 
CA ALAMEDA 94546 9 CASTRO VALLEY/HAYWARD 
CA ALAMEDA 94550 1 LIVERMORE 
CA ALAMEDA 94551 1 LIVERMORE 
CA ALAMEDA 94552 2 CASTRO VALLEY/HAYWARD 
CA ALAMEDA 94555 1 FREMONT