sql - Combine rows if value is blank -


i'm using sql-server 2008. need combine rows same name , increase counter when:

  1. 1 or more id's same name blank
  2. not merge rows if id null!
  3. not merge rows if have same name, different ids

output now:

name    id   cnt john    1     1 peter   2     2 -- peter same id have 2 entries cnt = 2 peter   3     1 -- other peter 1 entry cnt = 1 lisa    4     1 lisa   null   1 david   5     1 david         1 -- here id blank '' ralph         2 -- ralph have both rows blank id cnt = 2 

desired output:

name    id   cnt john    1     1 peter   2     2 peter   3     1 lisa    4     1 lisa   null   1 -- null still here david   5     2 -- merged blank '' cnt = 2 ralph         2 -- merged both blanks '' cnt = 2 

sql-query:

this sample query i'm using now:

select name,         id,         count(id) cnt employees                        condition = 1                  group name, id 

what have tried:

added aggregate max id in select clause , grouped name only, in case merged rows null values , same names different id's wrong me.

select name,         max(id), -- added aggregate        count(id) cnt employees                        condition = 1                  group name -- grouped name 

have ideas? if not clear problem - ask me, provide more details.

update:

ddl

create table employees (   name nvarchar(40),   id nvarchar(40) ); 

dml

insert employees values  ('john' ,   '1') ,('peter',   '2') ,('peter',   '2') ,('peter',   '3') ,('lisa' ,   '4') ,('lisa' ,  null) ,('david',   '5') ,('david',   '') ,('ralph',   '') ,('ralph',   '') 

demo: sql fiddle

edit

declare @data table (name varchar(10), id varchar(10)) -- id must varchar blank value insert @data values ('john', '1'), ('peter', '2'),('peter', '2'),  ('peter', '3'),--('peter', ''), --for test ('lisa', '4'), ('lisa', null), ('david', '5'), ('david', ''), ('ralph', ''), ('ralph', '') 

select      name,      id,      count(*) + isnull(         (select count(*) @data name = d.name , id = '' , d.id <> '')     , 0) cnt  @data d       id null      or id <> ''      or not exists(select * @data name = d.name , id <> '') group name, id 

Comments