2014-09-05 47 views
0

我有一个在SQL Server中的表格,下面的条目。如何分组透视列?

Name Type  Amount 
------------------------------ 
ABC  Opening  100 
CBD  Invoice  200 
ABC  Spreadsheet 250 
FBD  Closing  400 

我想创建一个基于上述的数据透视表,但是,我也试图将类型列分成3个不同的列。

  • 开放
  • 下面关闭
  • 活性(其他)

见表。这可能吗?

Name Opening Activity Closing 
---------------------------------------- 
ABC  100   200   0 
CBD  0   250   0 
FBD  0   0  400 

代码到目前为止

select * 
from 
    (
     select [Name] 
       ,[Type] 
       ,[Amount] 
     from my_Table 
    ) a 
    pivot(sum(Amount) 
    for Type in (Opening], [Closing]) 
    )as pvt 

我如何去这样做呢?

回答

3

我建议用聚合函数CASE表达式这样做:

select 
    name, 
    sum(case when type = 'Opening' then Amount else 0 end) Opening, 
    sum(case when type not in ('Opening', 'Closing') then Amount else 0 end) Activity, 
    sum(case when type = 'Closing' then Amount else 0 end) Closing 
from my_table 
group by name; 

SQL Fiddle with Demo。您将使用CASE逻辑专门查找OpeningClosing值,然后最后一列将对Type不是OpeningClosing的行进行求和。

您可以使用PIVOT获得结果,您只需要在应用pivot函数之前关联“其他”活动。为此,您可以使用子查询:

select name, Opening, Activity, Closing 
from 
(
    select 
    name, 
    type = case 
       when type not in ('Opening', 'Closing') 
       then 'Activity' 
       else type 
      end, 
    amount 
    from my_table 
) d 
pivot 
(
    sum(amount) 
    for type in (Opening, Activity, Closing) 
)piv; 

SQL Fiddle with Demo