i'm using sql-server 2008. need combine rows same name , increase counter when:
- 1 or more
id'ssamenameblank - not merge rows if
idnull! - not merge rows if have same
name, differentids
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
Post a Comment