1

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

是否可以?

谢谢你。

4

2 回答 2

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

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

于 2013-06-24T14:31:30.633 回答
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

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

于 2013-06-24T14:34:21.510 回答