3

私はSQLが初めてです。列に同じデータ (この場合は郵便番号) が含まれる行の行/列を組み合わせる単純な SQL ソリューションを探しています。たとえば、データは次のようになります。

州、郡、都市、郵便番号、カウント

"CA"、"アラメダ"、"ヘイワード"、"94541"、5371
"CA"、"アラメダ"、"ヘイワード"、"94542"、2209
"CA"、"アラメダ"、"ヘイワード"、"94544"、7179
"CA"、"アラメダ"、"ヘイワード"、"94545"、4209
"CA"、"ALAMEDA"、"CASTRO VALLEY"、"94546"、7213
"CA"、"アラメダ"、"ヘイワード"、"94546"、37
"CA"、"ALAMEDA"、"LIVERMORE"、"94550"、9809
"CA"、"ALAMEDA"、"LIVERMORE"、"94551"、6558
"CA"、"ALAMEDA"、"CASTRO VALLEY"、"94552"、3121
"CA"、"アラメダ"、"ヘイワード"、"94552"、12
"CA"、"ALAMEDA"、"FREMONT"、"94555"、5392

私はこのように見えるようにデータで終わりたいと思います:

州、郡、都市、郵便番号、カウント

"CA"、"アラメダ"、"ヘイワード"、"94541"、5371
"CA"、"アラメダ"、"ヘイワード"、"94542"、2209
"CA"、"アラメダ"、"ヘイワード"、"94544"、7179
"CA"、"アラメダ"、"ヘイワード"、"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

2 つの行で、データが結合または合計されていることがわかります。まったく同じ郵便番号を含む行の場合、都市名 (両方) が都市列に表示され、カウントは各行のカウントの合計になります。

SQLを使用してこれを行う方法はありますか? 2 つの異なる SQL ステートメントが必要な場合でも問題ありません。

4

2 に答える 2

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

幸運を。

于 2013-01-28T21:00:34.250 に答える
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
于 2013-01-28T21:10:25.460 に答える