我需要使用SQL Server制作这个特定的数据透视表,但无法使其工作。
我有什么:
id name was_clicked times
1 CustomerA 0 654
1 CustomerA 1 24
1 CustomerB 0 121
1 CustomerB 1 12
1 CustomerC 0 1203
1 CustomerC 1 67
我想要的是什么:
id name views clicks
1 CustomerA 654 24
1 CustomerB 121 12
1 CustomerC 1203 67
有可能吗?
谢谢。
答案 0 :(得分:2)
您可以使用带有CASE表达式的聚合函数来获得结果:
select id, name,
sum(case when was_clicked = 0 then times else 0 end) views,
sum(case when was_clicked = 1 then times else 0 end) clicks
from yourtable
group by id, name;
或者您可以使用PIVOT功能:
select id, name, views, clicks
from
(
select id, name,
case when was_clicked = 1 then 'clicks' else 'views' end vc,
times
from yourtable
) d
pivot
(
sum(times)
for vc in (clicks, views)
) piv
答案 1 :(得分:1)
关于PIVOT
的基本示例,您可以要求:
declare @t table (id int, name varchar(10),was_clicked bit,times int)
insert into @t(id, name, was_clicked, times) values
( 1 ,'CustomerA', 0, 654 ),
( 1 ,'CustomerA', 1, 24 ),
( 1 ,'CustomerB', 0, 121 ),
( 1 ,'CustomerB', 1, 12 ),
( 1 ,'CustomerC', 0, 1203 ),
( 1 ,'CustomerC', 1, 67 )
select
id,
name,
[0] as views,
[1] as clicks
from @t t pivot (MAX(times) for was_clicked in ([0],[1])) as pt
您总是必须在PIVOT
表达式中包含某些聚合,因为可以是多个匹配的行,这些行应该在同一列和行中结束结果集中的位置。当你碰巧知道只有一个是可能的时候,MIN
,MAX
和SUM
之间的选择有点武断。
我倾向于默认使用MIN
或MAX
,因为它也适用于非数字类型。