2015-06-01 6 views
0

Я использую SQL Server 2012. У меня есть таблица CustomerMaster. Вот некоторое содержание образца:SQL Server 2012 Count

+--------+---------------+-----------------+-------------+ 
| CustNo | NewMainCustNo | Longname  | NoOfMembers | 
+--------+---------------+-----------------+-------------+ 
| 3653 | 3653   | GroupId:003  |    | 
| 3654 | 3654   | GroupId:004  |    | 
| 11  | 3653   | Peter Evans  |    | 
| 155 | 3653   | Harold Charley |    | 
| 156 | 3654   | David Arnold |    | 
| 160 | 3653   | Mickey Willson |    | 
| 2861 | 3653   | Jonathan Wickey |    | 
| 2871 | 3653   | William Jason |    | 
+--------+---------------+-----------------+-------------+ 

NewMainCustNo для записей клиентов эквивалентен CustNo из группы записей. В основном каждый клиент принадлежит к определенной группе.

Мой вопрос заключается в том, как обновить столбец NoOfMembers для групповых записей с общим количеством клиентов, принадлежащих к определенной группе.

Пожалуйста, поделитесь своими идеями о том, как это сделать.

Спасибо ...

ответ

1

Это решение, которое я придумал

update CustomerMaster 
set NoOfMembers = (select count(*) from CustomerMaster m2 where m2.NewMainCustNo = CustomerMaster.CustNo and m2.CustNo <> CustomerMaster.CustNo) 
where LongName like 'GroupId:%' 

this SQL Fiddle Проверьте, чтобы увидеть запрос в действии.

Однако я не согласен с вашей структурой данных. У вас должна быть отдельная таблица для ваших групп. В таблице клиентов вам нужно только указать идентификатор группы в таблице групп. Это делает все (включая запрос выше) намного чище.

+0

Спасибо большое, что это сработало ... –

+0

Да, я знаю, что вы имеете в виду, но намного проще иметь все в одной таблице для целей переноса данных. Это не содержание живого БД. Это данные, необходимые для целей DM. Спасибо всем за поддержку. –

0

Если я правильно понимаю, вы можете использовать функцию окна для обновления. Вот пример с обновляемым КТР:

with toupdate as (
     select cm.*, count(*) over (partition by NewMainCustNo) as grpcount 
     from customermaster 
    ) 
update toupdate 
    set NoOfMembers = grpcount; 
+0

Спасибо, Гордон, но он также вычисляет запись группы. Я хочу, чтобы количество членов принадлежало группе, исключая групповой отчет. Какие-либо предложения? –

+0

@Devinda. , , Можете ли вы просто вычесть 1? –

+0

Привет, Гордон, нет, я не пробовал вычитать на 1, я попробую и дам вам знать человека. много thanx для вашей поддержки, приветствия ;-) –

0

Возможно, у вас нет возможности сделать это, но я бы разделил группы на свою таблицу.

create table Groups (
     GroupID int primary key, 
     Name varchar(200) 
    ) 

Затем измените NewMainCustNo на GroupID, создать, очистит таблицу клиентов групп, и идти оттуда. Затем, получив количество групп, будет:

select GroupID, 
     Name [Group Name], 
     COUNT(*) 
    from Groups g 
    join Customers c on 
     c.GroupID = g.GroupID