繁体   English   中英

如何将联接SELECT语句的多个列滚动到单个组合行中?

[英]How to ROLLUP multiple columns that are joined SELECT statements into a single combined row?

我正在从表[Data]。[FCNP_Log]中进行查看,该表具有多个不同“生产区域”的多个不同属性的计数。 我需要的是另外一行,在“生产区域”列下显示“全部”,并且在每一列中具有所有其他行的总数。 我几乎满足了我的需求,但是下面的代码并不能完全满足我的需求。

SELECT 
        ISNULL(total.[Production Area], 'All') AS [Production Area]
    ,   COALESCE(total.[Total], 0) AS [Total]
    ,   COALESCE(inprocess.[In Process], 0) AS [In Process]
    ,   COALESCE(closed.[Closed], 0) AS [Closed]
    ,   COALESCE(nofurtheraction.[No Further Action], 0) AS [No Further Action]
    ,   COALESCE([60day].[60 Day], 0) AS [60 Day]
    ,   COALESCE(dir.[DIR], 0) AS [DIR]
    ,   COALESCE([8d].[8D], 0) AS [8D]
FROM
(SELECT 
        [DEPARTMENT] AS 'Production Area'
    ,   COUNT([FCNP]) AS 'Total'
FROM [Data].[FCNP_Log]
GROUP BY [DEPARTMENT] WITH ROLLUP) total

FULL OUTER JOIN
(SELECT 
        [DEPARTMENT] AS 'Production Area'
    ,   COUNT([FCNP]) AS 'In Process'
FROM [Data].[FCNP_Log]
WHERE [FCNPStatus] = 'In Process'
GROUP BY [DEPARTMENT] WITH ROLLUP) inprocess

ON
total.[Production Area] = inprocess.[Production Area]

FULL OUTER JOIN
(SELECT
        [DEPARTMENT] AS 'Production Area'
    ,   COUNT(FCNP) AS 'Closed'
FROM [Data].[FCNP_Log]
WHERE [FCNPStatus] = 'Closed'
GROUP BY [DEPARTMENT] WITH ROLLUP) closed

ON
total.[Production Area] = closed.[Production Area]

FULL OUTER JOIN
(SELECT
        [DEPARTMENT] AS 'Production Area'
    ,   COUNT([FCNP]) AS 'No Further Action'
FROM [Data].[FCNP_Log]
WHERE [Long_TermCANoFurtherAction] = 1
GROUP BY [DEPARTMENT] WITH ROLLUP) nofurtheraction

ON
total.[Production Area] = nofurtheraction.[Production Area]

FULL OUTER JOIN
(SELECT
        [DEPARTMENT] AS 'Production Area'
    ,   COUNT([FCNP]) AS '60 Day'
FROM [Data].[FCNP_Log]
WHERE [Long_Term60Day] = 1
GROUP BY [DEPARTMENT] WITH ROLLUP) [60day]

ON
total.[Production Area] = [60day].[Production Area]

FULL OUTER JOIN
(SELECT
        [DEPARTMENT] AS 'Production Area'
    ,   COUNT([FCNP]) AS 'DIR'
FROM [Data].[FCNP_Log]
WHERE [Long_TermCADIR] = 1
GROUP BY [DEPARTMENT] WITH ROLLUP) dir

ON
total.[Production Area] = dir.[Production Area]

FULL OUTER JOIN
(SELECT
        [DEPARTMENT] AS 'Production Area'
    ,   COUNT([FCNP]) AS '8D'
FROM [Data].[FCNP_Log]
WHERE [Long_TermCA8D] = 1
GROUP BY [DEPARTMENT] WITH ROLLUP) [8d]

ON
total.[Production Area] = [8d].[Production Area]

这段代码为我提供了下表: http : //i.imgur.com/LjSvZSK.png

如您所见,我拥有的ROLLUP正确地累加了各列,但是它们是错开的,因此我需要将所有“所有”行组合成一行。

我尝试将整个代码块选择为“ t1”,并在末尾添加一个附加的GROUP BY t1。[生产区域]带ROLLUP,但这给了我错误。

我觉得可能有一个简单的解决方案,但我不知道。 任何帮助表示赞赏。

编辑:我确实想出一种方法来获得想要的结果。 我删除了所有WITH ROLLUP并将WITH CountTable AS (放在上面的代码之前,并将以下代码放在后面:

)


SELECT * FROM CountTable
UNION
SELECT
        'All'                               AS [Production Area]
    ,   SUM(CountTable.[Total])             AS [Total]
    ,   SUM(CountTable.[In Process])        AS [In Process]
    ,   SUM(CountTable.[Closed])            AS [Closed]
    ,   SUM(CountTable.[No Further Action]) AS [No Further Action]
    ,   SUM(CountTable.[60 Day])            AS [60 Day]
    ,   SUM(CountTable.[DIR])               AS [DIR]
    ,   SUM(CountTable.[8D])                AS [8D]
FROM CountTable

编辑:我确实想出一种方法来获得想要的结果。 我删除了所有WITH ROLLUP并将WITH CountTable AS (放在上面的代码之前,并将以下代码放在后面:

)


SELECT * FROM CountTable
UNION
SELECT
        'All'                               AS [Production Area]
    ,   SUM(CountTable.[Total])             AS [Total]
    ,   SUM(CountTable.[In Process])        AS [In Process]
    ,   SUM(CountTable.[Closed])            AS [Closed]
    ,   SUM(CountTable.[No Further Action]) AS [No Further Action]
    ,   SUM(CountTable.[60 Day])            AS [60 Day]
    ,   SUM(CountTable.[DIR])               AS [DIR]
    ,   SUM(CountTable.[8D])                AS [8D]
FROM CountTable

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM