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
我关注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