2017-08-11 22 views
1
SELECT 
    COUNT([P].[pkPortfolioId]) AS [OutcomeNotSubmitted], 
    [CG].[GroupName] 
FROM 
    opp.Portfolio AS [P] 
INNER JOIN 
    [vendor].[CustomerGroup] AS [CG] ON [P].[fkCustomerGroupId] = [CG].[pkCustomerGroupId] 
WHERE 
    fkOutcomeId IS NULL 
GROUP BY 
    [CG].[GroupName] 

该查询可以正常工作,但有多种结果,如下所示。为了使此查询正常工作,我需要复制此查询以获得所需的结果。另外还有很多连接。请记住,这是例如修剪的查询。在CASE中使用CASE中的列而没有在组中使用

我想要实现这样的结果:

NAME WIN PartialWin Loss OutcomeNotSubmitted 
--------------------------------------------------------- 
Chain 1  0   1     0 

下面这个我试图在一个查询

SELECT 
    CASE 
     WHEN [P].[fkOutcomeId] = 1 THEN COUNT([P].[pkPortfolioId]) 
    END AS [Win], 
    CASE 
     WHEN [P].[fkOutcomeId] = 2 THEN COUNT([P].[pkPortfolioId]) 
    END AS [PartialWin], 
    CASE 
     WHEN [P].[fkOutcomeId] = 3 THEN COUNT([P].[pkPortfolioId]) 
    END AS [Loss], 
    CASE 
     WHEN [P].[fkOutcomeId] IS NULL THEN COUNT([P].[pkPortfolioId]) 
    END AS [OutcomeNotSubmitted], 
    [CG].[GroupName] 
FROM 
    opp.Portfolio AS [P] 
INNER JOIN 
    [vendor].[CustomerGroup] AS [CG] ON [P].[fkCustomerGroupId] = [CG].[pkCustomerGroupId] 
GROUP BY 
    [CG].[GroupName] 

错误来实现这一目标:

Column 'opp.Portfolio.fkOutcomeId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

回答

3

错误的顺序。 case应该是聚合函数的参数。假设投资组合的id是从来没有NULL,我会用SUM()

SELECT SUM(CASE WHEN [P].[fkOutcomeId] = 1 THEN 1 ELSE 0 END) AS Win, 
     SUM(CASE WHEN [P].[fkOutcomeId] = 2 THEN 1 ELSE 0 END) AS PartialWin, 
     SUM(CASE WHEN [P].[fkOutcomeId] = 3 THEN 1 ELSE 0 END) AS Loss, 
     SUM(CASE WHEN [P].[fkOutcomeId] IS NULL THEN 1 ELSE 0 END) AS OutcomeNotSubmitted, 
     [CG].[GroupName] 
FROM opp.Portfolio [P] INNER JOIN 
    [vendor].[CustomerGroup] [CG] 
    ON [P].[fkCustomerGroupId] = [CG].[pkCustomerGroupId] 
GROUP BY [CG].[GroupName]; 
+0

当这个答案弹出时,我正在输入相同的东西。就是这个。 – Nick

+0

@尼克我在做同样的事情哈哈。 – RToyo

0

上面的回答是正确的,如果你不包括任何更多的联接则已经如上图所示。

随着更多连接的添加,SUM不再满足对pkPortfolioId的数量进行计数的要求。

SELECT COUNT(DISTINCT(CASE WHEN [P].[fkOutcomeId] = 1 THEN [P].[pkPortfolioId] ELSE NULL END)) AS Win, 
     COUNT(DISTINCT(CASE WHEN [P].[fkOutcomeId] = 2 THEN [P].[pkPortfolioId] ELSE NULL END)) AS PartialWin, 
     COUNT(DISTINCT(CASE WHEN [P].[fkOutcomeId] = 3 THEN [P].[pkPortfolioId] ELSE NULL END)) AS Loss, 
     COUNT(DISTINCT(CASE WHEN [P].[fkOutcomeId] IS NULL THEN [P].[pkPortfolioId] ELSE NULL END)) AS OutcomeNotSubmitted, 
    [CG].[GroupName] AS [Name] 
FROM [opp].[Portfolio] AS [P] 
INNER JOIN [vendor].[CustomerGroup] AS [CG] ON [P].[fkCustomerGroupId] = [CG].[pkCustomerGroupId] 
GROUP BY [CG].[GroupName]