Sql 透视多个列,不考虑聚合结果

Sql 透视多个列,不考虑聚合结果,sql,sql-server,Sql,Sql Server,我正在尝试透视多列数据。这是我尝试过的问题 ;WITH CTE(Project,Cost,spc,CostType) AS ( SELECT 'Project 1', 100 ,103,'Internal' UNION ALL SELECT 'Project 1', 12 ,15,'External' UNION ALL SELECT 'Project 2', 45 ,22,'Internal' UNION ALL SELECT 'Project 2', 2 ,37,'External'

我正在尝试透视多列数据。这是我尝试过的问题

;WITH CTE(Project,Cost,spc,CostType)
AS
(
SELECT 'Project 1', 100 ,103,'Internal' UNION ALL
SELECT 'Project 1', 12  ,15,'External' UNION ALL
SELECT 'Project 2', 45  ,22,'Internal' UNION ALL
SELECT 'Project 2', 2   ,37,'External' UNION ALL
SELECT 'Project 2', 33  ,46,'Internal' UNION ALL
SELECT 'Project 3', 42  ,11,'External' UNION ALL
SELECT 'Project 4', 57  ,5,'Internal' UNION ALL
SELECT 'Project 5', 22  ,77,'Internal' UNION ALL
SELECT 'Project 5', 17  ,9,'External' 
)
SELECT Project,
        ISNULL([Internal],0) AS [Internal],
        ISNULL([External],0) AS [External],
        ISNULL([Internal2],0) AS [InternalSPC],
        ISNULL([External2],0) AS [ExternalSPC]
FROM
(
SELECT Project,
        Cost,
        spc,
        CostType,
        CostType+'2' as CostType2
from CTE
)AS SRC
PIVOT
(
SUM(Cost) FOR CostType IN ([Internal],[External])
)
AS PVT

PIVOT
(
SUM(spc) FOR CostType2 IN ([Internal2],[External2])
)
AS PVT
我得到的结果如下

但预期的结果是

 Project     Internal     External     InternalSPC     ExternalSPC
----------------------------------------------------------------------
 Project 1     100          12          103                15
 Project 2     78           2            68               37
 Project 3     0            42          0                 11
 Project 4     57           0             5               0
 Project 5     22          17          77               9
我不明白我的问题所在

根据答案编辑

第一个答案是使用分组。但奇怪的是,如果我们只考虑一个列的工作,我们预期没有分组。 检查这个查询,我只考虑一列

;WITH CTE(Project,Cost,spc,CostType)
AS
(
SELECT 'Project 1', 100 ,103,'Internal' UNION ALL
SELECT 'Project 1', 12  ,15,'External' UNION ALL
SELECT 'Project 2', 45  ,22,'Internal' UNION ALL
SELECT 'Project 2', 2   ,37,'External' UNION ALL
SELECT 'Project 2', 33  ,46,'Internal' UNION ALL
SELECT 'Project 3', 42  ,11,'External' UNION ALL
SELECT 'Project 4', 57  ,5,'Internal' UNION ALL
SELECT 'Project 5', 22  ,77,'Internal' UNION ALL
SELECT 'Project 5', 17  ,9,'External' 
)
SELECT Project,
        ISNULL([Internal],0) AS [Internal],
        ISNULL([External],0) AS [External]
FROM
(
SELECT Project,
        Cost,
        CostType
from CTE
)AS SRC
PIVOT
(
SUM(Cost) FOR CostType IN ([Internal],[External])
)
AS PVT
上述查询的结果如下


我不明白为什么它在不分组的情况下适用于1列透视。

尝试以下方法:将group by与project column和sum聚集一起使用

;WITH CTE(Project,Cost,spc,CostType)
AS
(
SELECT 'Project 1', 100 ,103,'Internal' UNION ALL
SELECT 'Project 1', 12  ,15,'External' UNION ALL
SELECT 'Project 2', 45  ,22,'Internal' UNION ALL
SELECT 'Project 2', 2   ,37,'External' UNION ALL
SELECT 'Project 2', 33  ,46,'Internal' UNION ALL
SELECT 'Project 3', 42  ,11,'External' UNION ALL
SELECT 'Project 4', 57  ,5,'Internal' UNION ALL
SELECT 'Project 5', 22  ,77,'Internal' UNION ALL
SELECT 'Project 5', 17  ,9,'External' 
)
SELECT Project,
        sum(ISNULL([Internal],0)) AS [Internal],
        sum(ISNULL([External],0)) AS [External],
        sum(ISNULL([Internal2],0)) AS [InternalSPC],
        sum(ISNULL([External2],0)) AS [ExternalSPC]
FROM
(
SELECT Project,
        Cost,
        spc,
        CostType,
        CostType+'2' as CostType2
from CTE
)AS SRC
PIVOT
(
SUM(Cost) FOR CostType IN ([Internal],[External])
)
AS PVT

PIVOT
(
SUM(spc) FOR CostType2 IN ([Internal2],[External2])
)
AS PVT
group by Project

尝试以下操作:将GROUPBY与项目列和总和聚合一起使用

;WITH CTE(Project,Cost,spc,CostType)
AS
(
SELECT 'Project 1', 100 ,103,'Internal' UNION ALL
SELECT 'Project 1', 12  ,15,'External' UNION ALL
SELECT 'Project 2', 45  ,22,'Internal' UNION ALL
SELECT 'Project 2', 2   ,37,'External' UNION ALL
SELECT 'Project 2', 33  ,46,'Internal' UNION ALL
SELECT 'Project 3', 42  ,11,'External' UNION ALL
SELECT 'Project 4', 57  ,5,'Internal' UNION ALL
SELECT 'Project 5', 22  ,77,'Internal' UNION ALL
SELECT 'Project 5', 17  ,9,'External' 
)
SELECT Project,
        sum(ISNULL([Internal],0)) AS [Internal],
        sum(ISNULL([External],0)) AS [External],
        sum(ISNULL([Internal2],0)) AS [InternalSPC],
        sum(ISNULL([External2],0)) AS [ExternalSPC]
FROM
(
SELECT Project,
        Cost,
        spc,
        CostType,
        CostType+'2' as CostType2
from CTE
)AS SRC
PIVOT
(
SUM(Cost) FOR CostType IN ([Internal],[External])
)
AS PVT

PIVOT
(
SUM(spc) FOR CostType2 IN ([Internal2],[External2])
)
AS PVT
group by Project
首先,我会将数据解压,使其所有值都位于一列中,然后组合另一对列,以便我们有不同的名称,然后我们可以应用单个轴:

尝试失败的主要原因是PIVOT应用了不明显的分组1。因此,在第一个透视图中,Spc列中的值明显不同,这意味着您不只是为每个项目值生成单个输出行

因此,我通常尝试将这些类型的查询简化为应用一个只对感兴趣的列有效的透视

1我的意思是,我更喜欢PIVOT的显式GROUP BY语法,这样可以清楚地知道哪些列用于分组,而不是PIVOT子句中没有提到的当前结果集中的所有列。但即使使用这种语法,如果您可以按项目分组Spc不再可用于第二个数据透视,它也会突出显示。

我将首先取消数据透视,以便所有值都在一列中,合并另一对列,以便我们有不同的名称,然后我们可以应用单个数据透视:

尝试失败的主要原因是PIVOT应用了不明显的分组1。因此,在第一个透视图中,Spc列中的值明显不同,这意味着您不只是为每个项目值生成单个输出行

因此,我通常尝试将这些类型的查询简化为应用一个只对感兴趣的列有效的透视


1我的意思是,我更喜欢PIVOT的显式GROUP BY语法,这样可以清楚地知道哪些列用于分组,而不是PIVOT子句中没有提到的当前结果集中的所有列。但即使使用这种语法,如果您只需按项目分组Spc不再可用于第二个透视,它也会突出显示出来。

我会使用单个条件聚合查询来实现这一点:

select Project, 
       sum(case when costtype = 'Internal' then Cost else 0 end) as Internal,
       sum(case when costtype = 'External' then Cost else 0 end) as External,
       sum(case when costtype = 'Internal' then spc else 0 end) as InternalSPC ,
       sum(case when costtype = 'External' then spc else 0 end) as ExternalSPC 
from cte c
group by Project;

我将通过使用单个条件聚合查询来实现这一点:

select Project, 
       sum(case when costtype = 'Internal' then Cost else 0 end) as Internal,
       sum(case when costtype = 'External' then Cost else 0 end) as External,
       sum(case when costtype = 'Internal' then spc else 0 end) as InternalSPC ,
       sum(case when costtype = 'External' then spc else 0 end) as ExternalSPC 
from cte c
group by Project;

不要只是写,试试这个。解释你改变了什么。解释为什么它应该/将解决这个问题。@fa06非常感谢。如果你不介意的话,请检查一下修改后的问题。它工作正常,无需为一个柱轴分组。所以,为什么它不适用于2列而不分组当您有多个轴需要使用group by时,而不是一个轴很好,不要只写,试试这个。解释你改变了什么。解释为什么它应该/将解决这个问题。@fa06非常感谢。如果你不介意的话,请检查一下修改后的问题。它工作正常,无需为一个柱轴分组。如果你有多个支点需要使用group by,而不是一个支点是好的,那么为什么它不适用于2列而不分组呢?我在回答的底部用多支点来解决这个问题。