了解PIVOT?

时间:2017-07-07 17:05:40

标签: sql-server tsql

我见过的大多数例子都比较复杂,所以我想我发布了一些简单的内容来完全理解pivot的概念。

declare @yt TABLE
(
  Id int, 
  Dept varchar(10),
  [Day] int,
  [Counter] int
);

INSERT INTO @yt
(
  ID, Dept, [Day], [Counter]
)
VALUES
    (102, 'DeptA', 20170704, 96),
    (102, 'DeptP', 20170704, 223),
    (103, 'DeptA', 20170704, 84),
    (103, 'DeptW', 20170704, 43);

select *
from 
(
  select id, dept, [day], [Counter]
  from @yt
) src
pivot
(
  sum([Counter])
  for Dept in ([DeptA], [DeptP], [DeptW])
) piv;

根据我的理解,Pivot中的代码执行以下操作:1)聚合所选列(sum([counter])),在for Dept中转动列,然后执行group by未指定的其余列(IDDay)。

我可以添加两笔钱吗?或者这是否超出了枢轴功能的范围?以下内容会生成错误:

declare @yt TABLE
(
  Id int, 
  Dept varchar(10),
  [Day] int,
  [Counter] int,
  Sales int
);

INSERT INTO @yt
(
  ID, Dept, [Day], [Counter], Sales
)
VALUES
    (102, 'DeptA', 20170704, 96, 12),
    (102, 'DeptP', 20170704, 223, 5),
    (103, 'DeptA', 20170704, 84, 9),
    (103, 'DeptW', 20170704, 43, 11);

select *
from 
(
  select id, dept, [day], [Counter], sales
  from @yt
) src
pivot
(
  sum([Counter]), ([sales])
  for Dept in ([DeptA], [DeptP], [DeptW])
) piv;

想要补充一点,这个问题有助于理解pivot tables

1 个答案:

答案 0 :(得分:0)

您始终可以通过确保行是唯一的来阻止聚合操作。 虽然语法中仍然必须存在聚合{SUM | MIN | MAX},但如果这些行是唯一的,则它实际上不能有多行来操作。

更大的问题是,如果有多行,您希望发生什么。在下面的例子中,我复制了1个源行,你将通过运行代码看看它是如何出现的。如果您想忽略其他行,您只需添加"其中r = 1"。

rest[] = ourpackageimagevalue;