如何使用SQL Server根据特定条件创建数据透视表?

时间:2013-06-24 14:29:00

标签: sql sql-server tsql

我需要使用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

有可能吗?

谢谢。

2 个答案:

答案 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;

请参阅SQL Fiddle with Demo

或者您可以使用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

请参阅SQL Fiddle with Demo

答案 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表达式中包含某些聚合,因为可以是多个匹配的行,这些行应该在同一列和行中结束结果集中的位置。当碰巧知道只有一个是可能的时候,MINMAXSUM之间的选择有点武断。

我倾向于默认使用MINMAX,因为它也适用于非数字类型。