SQL 分组并计数

SQL group by and count

我关注table:

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 服务器 2012

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 和 firstname 字段同样为空):

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

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