2013-01-28 5 views
3

Я новичок в SQL. Я ищу простое решение SQL для объединения строки/столбца для строки, столбец которой содержит одни и те же данные, в этом случае - почтовый индекс. Например, внешний вид данных выглядит следующим образом:SQL Column/Row Grouping

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

Вы можете видеть, что в два ряда данных была объединены или суммированы. Для строк, которые содержат один и тот же почтовый индекс, названия городов (оба) отображаются в столбце city, а count - сумма счетчика из каждой строки.

Есть ли способ сделать это с помощью SQL? Даже если это требует двух разных операторов SQL, это нормально.

+4

Что такое СУБД? – 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