2013-06-05 108 views
4

我已經搜索,但沒有找到(或理解!)如何做我需要做的事情。我覺得有點傻問這個,因爲還有其他的例子,但我只是沒有得到它....交叉表查詢與SQL Server 2008 R2中的值計數

下面是我在一個視圖中的數據:

[Approach Status] [Clinic] 
Approached   GI Med Onc 
Pending   GI Med Onc 
Approached   GI Med Onc 
Not Approached  Breast Med Onc 
Approached   Breast Med Onc 

我需要的是:

[Approach Status] [GI Med Onc] [Breast Med Onc] 
Approached   2   1 
Not Approached  0   1 
Pending    1   0 

我玩過修改代碼我在這裏找到了,但....任何幫助表示讚賞!

回答

3

有幾種不同的方法可以將行轉換爲列。你能做到這一點的方法之一是使用聚合函數CASE表達式:

select ApproachStatus, 
    sum(case when Clinic = 'GI Med Onc' then 1 else 0 end) [GI Med Onc], 
    sum(case when Clinic = 'Breast Med Onc' then 1 else 0 end) [Breast Med Onc] 
from yt 
group by ApproachStatus; 

SQL Fiddle with Demo

或者因爲你正在使用SQL Server 2005 +,你可以使用旋轉功能:

select ApproachStatus, [GI Med Onc],[Breast Med Onc] 
from yt 
pivot 
(
    count(Clinic) 
    for Clinic in ([GI Med Onc],[Breast Med Onc]) 
) piv; 

請參閱SQL Fiddle with Demo

如果你有一個未知的Clinic值,那麼你就需要看使用動態SQL得到的結果:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Clinic) 
        from yt 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT ApproachStatus,' + @cols + ' 
      from yt 
      pivot 
      (
       count(Clinic) 
       for Clinic in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with Demo。所有查詢結果如下:

| APPROACHSTATUS | GI MED ONC | BREAST MED ONC | 
------------------------------------------------ 
|  Approached |   2 |    1 | 
| Not Approached |   0 |    1 | 
|  Pending |   1 |    0 | 
+0

謝謝。第一個例子的工作,但第二個(優選的)將返回此: GI醫學ONC乳腺癌醫學ONC 走近1 0 未決1 0 走近1 0 未接近0 1 走近0 1 –

+0

@ClintFinch可以編輯演示(http://sqlfiddle.com/#!3/ef8f0/3)與您的一些示例數據和您正在使用的查詢? – Taryn

+0

奇怪....我使用sqlfiddle時得到了正確的值....唯一的區別是我的數據源是一個包含許多列的視圖(不僅僅是我在這裏引用的兩個視圖)而不是表,應該如此? http://sqlfiddle.com/#!3/a4645/1/0 –