2017-08-11 21 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]