2014-02-18 79 views
-2

我有这样的桌子;SQL 2008 R2中的枢轴

Date  PlacementName campaignID Impressions Clicks TotalConversions Activity 

01/01/2014 USA    100   5000   500  50  Mobile Book 
01/02/2014 U.K    101   7000   250  30  Mobile Book 
01/01/2014 USA    100   9000   800  40  Mobile TV 
01/02/2014 U.K    101   6000   300  10  Mobile TV

我想旋转表15-20活动从真正的表,因为这只是示例表。

我想让我的桌子看起来像下面;

Date   PlacementName  CampaignID Impressions Clicks Mobile Book Mobile TV 
01/01/2014 USA    100   5000   500  50   NULL 
01/01/2014 U.K    100   9000   800  NULL   40 
01/02/2014 USA    101   7000   250  30   NULL 
01/02/2014 U.K    101   6000   300  NULL   10

这是我想要的决赛桌格式。我想写这个表的查询。

+3

您正在使用什么数据库管理系统?你做了什么研究?你有没有试图解决你的问题? – Kermit

+0

看看sql count和group by – gerrytan

+0

@FreshPrinceOfSO:如果你不能给出答案,请不要降级我的积分。我对这个环境很陌生,如果不想帮助先生,但不要降低我的声誉。 – ADBI

回答

2

获得结果的最简单方法是使用聚合函数和CASE表达式将数据行转换为列,但也可以应用PIVOT函数。

select date, 
    placementname, 
    campaignid, 
    impressions, 
    clicks, 
    sum(case when activity = 'Mobile Book' then TotalConversions else 0 end) MobileBook, 
    sum(case when activity = 'Mobile TV' then TotalConversions else 0 end) MobileTV 
from yourtable 
group by date, placementname, campaignid, impressions, clicks; 

SQL Fiddle with Demo

select date, placementname, 
    campaignid, impressions, 
    clicks, 
    [Mobile Book], [Mobile TV] 
from 
(
    select date, placementname, 
    campaignid, impressions, 
    clicks, activity, totalconversions 
    from yourtable 
) d 
pivot 
(
    sum(totalconversions) 
    for activity in ([Mobile Book], [Mobile TV]) 
) p 

SQL Fiddle with Demo

+0

非常感谢您的解决方案对我来说非常合适。非常感谢。但是,我已经尝试了第一个,因为第二个我已经尝试过了,但结果出现错误。再次感谢。 – ADBI

+1

@ADBI:你是否熟悉接受答案?我认为你没有接受你的个人资料中的任何内容,但看起来你已经多次评论说有些事情可行。要“接受”,请点击相应答案左侧的勾号图标,以使其变为绿色。它会给你一两点我觉得,更重要的是它感谢一个有帮助的人。 – halfer