Sql 使用两个聚合列进行透视

Sql 使用两个聚合列进行透视,sql,sql-server,pivot,Sql,Sql Server,Pivot,我试图透视一个表,但我有多个聚合列 数据看起来像 返回看起来像 很抱歉,我想不出如何把表放进去,所以我带了一些片段 我正在使用pivot代码: select * from( select col1, per1, per2 from table a left jo

我试图透视一个表,但我有多个聚合列

数据看起来像

返回看起来像

很抱歉,我想不出如何把表放进去,所以我带了一些片段

我正在使用pivot代码:

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并检查我编辑的回复。如果你还在挣扎,请告诉我。