2015-04-03 75 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

您使用的數據庫是?你試過什麼了? – 2015-04-03 13:28:26

+0

sql server 2012 – 2015-04-03 13:29:57

回答

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 

小提琴: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個被標記爲主要訂單,那麼訂單將被多次列出。 – 2015-04-03 13:36:53

+0

問題可能出現在這一行:'select count (*)作爲聯繫人,或由orderid從tbl組中刪除,因爲聯繫人表具有數百萬行,這基本上掃描了所有這些行。 – 2015-04-03 13:40:26

+0

@hairraisin同意,儘管這應該在應用程序級別處理。儘管如此,我添加了第二個查詢來解決「無主要聯繫人」的可能性。 – 2015-04-03 13:43:35

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