Sql 使用两个聚合列进行透视
我试图透视一个表,但我有多个聚合列 数据看起来像 返回看起来像 很抱歉,我想不出如何把表放进去,所以我带了一些片段 我正在使用pivot代码:Sql 使用两个聚合列进行透视,sql,sql-server,pivot,Sql,Sql Server,Pivot,我试图透视一个表,但我有多个聚合列 数据看起来像 返回看起来像 很抱歉,我想不出如何把表放进去,所以我带了一些片段 我正在使用pivot代码: select * from( select col1, per1, per2 from table a left jo
select *
from(
select
col1,
per1,
per2
from
table a
left join table 2 b on a.ID = b.ID
where
a.END_DTTM is null
group by
a.COL3
) d
pivot
(
max(d.per1),
max(d.per2)
for d.col1 in (A, B, C)
) piv;
不能在同一步骤上进行两次透视,因为透视会隐式地分组未引用的列。除了聚合函数和数据透视列外,您只需将数据透视应用于没有不同值的列子集。请尝试以下操作:
;WITH PrePivot1 AS
(
SELECT
T.col1,
T.per1
FROM
YourTable AS T
),
PrePivot2 AS
(
SELECT
T.col1,
T.per2
FROM
YourTable AS T
),
Pivot1 AS
(
SELECT
P.A,
P.B,
P.C
FROM
PrePivot1 AS R
PIVOT (
MAX(R.per1) FOR R.Col1 IN ([A], [B], [C])
) AS P
),
Pivot2 AS
(
SELECT
P.A,
P.B,
P.C
FROM
PrePivot2 AS R
PIVOT (
MAX(R.per2) FOR R.Col1 IN ([A], [B], [C])
) AS P
)
SELECT
Concept = 'Per1',
P1.A,
P1.B,
P1.C,
FROM
Pivot1 AS P1
UNION ALL
SELECT
Concept = 'Per2',
P2.A,
P2.B,
P2.C,
FROM
Pivot2 AS P2
编辑:
要进行进一步计算,可以继续链接CTE。改变
SELECT
Concept = 'Per1',
P1.A,
P1.B,
P1.C,
FROM
Pivot1 AS P1
UNION ALL
SELECT
Concept = 'Per2',
P2.A,
P2.B,
P2.C,
FROM
Pivot2 AS P2
与
不能在同一步骤上进行两次透视,因为透视会隐式地分组未引用的列。除了聚合函数和数据透视列外,您只需将数据透视应用于没有不同值的列子集。请尝试以下操作:
;WITH PrePivot1 AS
(
SELECT
T.col1,
T.per1
FROM
YourTable AS T
),
PrePivot2 AS
(
SELECT
T.col1,
T.per2
FROM
YourTable AS T
),
Pivot1 AS
(
SELECT
P.A,
P.B,
P.C
FROM
PrePivot1 AS R
PIVOT (
MAX(R.per1) FOR R.Col1 IN ([A], [B], [C])
) AS P
),
Pivot2 AS
(
SELECT
P.A,
P.B,
P.C
FROM
PrePivot2 AS R
PIVOT (
MAX(R.per2) FOR R.Col1 IN ([A], [B], [C])
) AS P
)
SELECT
Concept = 'Per1',
P1.A,
P1.B,
P1.C,
FROM
Pivot1 AS P1
UNION ALL
SELECT
Concept = 'Per2',
P2.A,
P2.B,
P2.C,
FROM
Pivot2 AS P2
编辑:
要进行进一步计算,可以继续链接CTE。改变
SELECT
Concept = 'Per1',
P1.A,
P1.B,
P1.C,
FROM
Pivot1 AS P1
UNION ALL
SELECT
Concept = 'Per2',
P2.A,
P2.B,
P2.C,
FROM
Pivot2 AS P2
与
您还可以使用应用(即交叉应用)操作符将数据从列转换为行
select
name as pear,
max(case when cols = 'A' then value end) [A],
max(case when cols = 'B' then value end) [B],
max(case when cols = 'C' then value end) [C]
from table t
cross apply (values (col1, 'per1', per1), (col1, 'per2', per2))a(cols, name, value)
group by name
您还可以使用应用(即交叉应用)操作符将数据从列转换为行
select
name as pear,
max(case when cols = 'A' then value end) [A],
max(case when cols = 'B' then value end) [B],
max(case when cols = 'C' then value end) [C]
from table t
cross apply (values (col1, 'per1', per1), (col1, 'per2', per2))a(cols, name, value)
group by name
将数据和结果以文本形式发布,而不是以图像形式发布。我尝试过,但没有效果。图片做得很好。将数据和结果作为文本而不是图片发布。我试过了,但不起作用。图像很好。嗨,对不起,我不明白。该值是多少?为什么使用“根据名称”?per1和per2都是不同的计数,因此需要保持分离。谢谢,对不起,我不明白。该值是多少?为什么使用“根据名称”?per1和per2都是不同的计数,因此需要保持分离。谢谢这工作做得非常好!非常感谢你:因为你对这些东西很在行,我想知道你是否能帮我做下一部分。我需要将A列和B列中的值与C列中的值分开。我曾尝试使用此代码中的select,但不起作用。有什么建议吗?@beckypurl并检查我编辑的回复。如果你还在挣扎,请告诉我。这工作绝对完美!非常感谢你:因为你对这些东西很在行,我想知道你是否能帮我做下一部分。我需要将A列和B列中的值与C列中的值分开。我曾尝试使用此代码中的select,但不起作用。有什么建议吗?@beckypurl并检查我编辑的回复。如果你还在挣扎,请告诉我。