2013-12-19 23 views
4

我有一組合同和工作人員的國籍。樣本如下。計數如果或計數在SQL中的位置

Contract Country 
GTT001 DE 
GTT001 DE 
GTT001 US 
BFF333 US 
BFF333 US 
BFF333 DE 
HHH222 GB 
HHH222 GB 
HHH222 GB 

我需要一個查詢來計算每個國家每個合同上工作的人數。因此,人們會產生一種表像下面:

  DE US GB 
GTT001 2 1  0 
BFF333 1 2  0 
HHH222 0 0  3 

我在Access 2010中的工作是否有一個COUNTIF或某些等效,讓我來算基於條件的值?

+2

它被稱爲* Pivot *。當你知道你正在尋找的東西是如何被調用的時候,找到答案應該會更容易。 – MarcinJuraszek

回答

0
DECLARE @Pivotcols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX) 
     select @Pivotcols = STUFF((SELECT distinct N',' + QUOTENAME([Country]) 
       from [Contract] 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

    select @Pivotcols 

    set @query = N'SELECT [Contract], ' + @Pivotcols + N' 
     from 
     (
      SELECT [Contract] 
    ,[Country] 
    FROM [TEST_DB].[dbo].[Contract] 

     ) sourceTable 
     pivot 
     (
      Count([Country]) 
      for [Country] in (' + @Pivotcols + N') 
     ) p ' 

    execute sp_executesql @query; 


核心查詢

SELECT * from 
    (SELECT [Contract] 
    ,[Country] 
    FROM [TEST_DB].[dbo].[Contract] 
) sT 
    pivot 
     (
      Count([Country]) 
      for [Country] in ([DE],[US],[GB]) 
     ) p 
3

您想要使用GROUP BY同時使用合同和國家。這會給你一個列表如下:

Contract Country Count 
GTT001 DE  2 
GTT001 US  1 
BFF333 US  2 
BFF333 DE  1 
HHH222 GB  3 

那麼你一定要轉動這些值來得到它成你想要的格式。在0仍然會丟失...

0

PIVOT會工作,這是一個比較複雜一點,但這樣原始的SQL你可以GROUP BY,例如:

SELECT合同,國家,COUNT(*)
FROM [YourTable]
GROUP BY合同,國家
ORDER BY國家