我见过的大多数例子都比较复杂,所以我想我发布了一些简单的内容来完全理解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
未指定的其余列(ID
和Day
)。
我可以添加两笔钱吗?或者这是否超出了枢轴功能的范围?以下内容会生成错误:
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。
答案 0 :(得分:0)
您始终可以通过确保行是唯一的来阻止聚合操作。 虽然语法中仍然必须存在聚合{SUM | MIN | MAX},但如果这些行是唯一的,则它实际上不能有多行来操作。
更大的问题是,如果有多行,您希望发生什么。在下面的例子中,我复制了1个源行,你将通过运行代码看看它是如何出现的。如果您想忽略其他行,您只需添加"其中r = 1"。
rest[] = ourpackageimagevalue;