2015-04-03 4 views
0

я следующую таблицу:SQL группа по и сосчитать

OrderId ContactId IsPrimaryContact FirstName 
1   1   1     John 
1   2   0     Steve 
2   3   1     Mary 

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

Contacts OrderId ContactId FirstName 
2   1   1   John 
1   2   3   Mary 

Использование SQL Server 2012

+0

Какую базу вы используете? что ты уже испробовал? –

+0

sql server 2012 –

ответ

3
select x.contacts, y.orderid, y.contactid, y.firstname 
    from (select count(*) as contacts, orderid from tbl group by orderid) x 
    join tbl y 
    on x.orderid = y.orderid 
where y.isprimarycontact = 1 

Fiddle:http://sqlfiddle.com/#!6/62149/2/0

Над ответом предполагает: 1. Каждый заказ может иметь не более одного первичного контакта 2. В каждом заказе указан первичный контакт

Ниже ответ будет рассматривать возможность заказа, не имеющих первичный контакт в списке (хотя ContactID и ПгвЬЫате поля будут пустыми, так же):

select x.contacts, x.orderid, y.contactid, y.firstname 
    from (select count(*) as contacts, orderid from tbl group by orderid) x 
    left join tbl y 
    on x.orderid = y.orderid 
    and y.isprimarycontact = 1 
+0

+1 Это, вероятно, как можно ближе. Возможно, стоит отметить, что если контактов нет как первичных, этот порядок будет отсутствовать, и если в нем будет указано более 1, то порядок будет указан несколько раз. –

+0

Проблема может быть в этой строке: 'select count (*) в качестве контактов, orderid из tbl group by orderid', так как таблица контактов имеет миллионы строк, и это в основном сканирует их все –

+0

@hairraisin согласен, хотя это должно обрабатываться на уровне приложения. Однако я добавил второй запрос для решения проблемы «отсутствия первичного контакта». –

2

С CROSS APPLY:

DECLARE @t TABLE(OrderID INT, ContactID INT, IsPrimary BIT, FirstName NVARCHAR(MAX)) 
INSERT INTO @t VALUES 
(1, 1, 1, 'John'), 
(1, 2, 0, 'Steve'), 
(2, 3, 1, 'Mary') 

SELECT o.Count, OrderID, ContactID, FirstName 
FROM @t t1 
CROSS APPLY(SELECT COUNT(*) AS Count FROM @t WHERE OrderID = t1.OrderID) o 
WHERE IsPrimary = 1 

Выход:

Count OrderID ContactID FirstName 
2  1  1   John 
1  2  3   Mary 
Смежные вопросы