Sql server IIF(计数)表达式并通过不返回预期结果进行分组

Sql server IIF(计数)表达式并通过不返回预期结果进行分组,sql-server,Sql Server,我将SSMS用于select语句,在该语句中,有许多表被联接。根据我使用的IIF(计数(*)的结果,其中一个字段需要标记为“M”或“N” select语句如下所示: SELECT , AcctChar.Chr1Nme AS [Submitted For Party] , P.LOCAL_CURR_CDE AS [Notional Currency 1] , T.PortfolioCode AS [Acct

我将SSMS用于select语句,在该语句中,有许多表被联接。根据我使用的IIF(计数(*)的结果,其中一个字段需要标记为“M”或“N”

select语句如下所示:

SELECT
,   AcctChar.Chr1Nme             AS [Submitted For Party]   
,   P.LOCAL_CURR_CDE             AS [Notional Currency 1]
,   T.PortfolioCode              AS [Acct_ID]
,   T.IAMID                      AS [IAMID]
,   iif(count(*) > 1, 'M', 'N')  AS [ActionType]
,   T.Quantity                   AS [Quantity]
,   p.FLD1_AMT                   AS [Notional]
,   I.ISS_TMS                    AS [EffectiveDte]

from [dbo].[POSITION] AS p

INNER JOIN [dbo].[Trades] AS T
                    ON    T.PortfolioCode = P.ACCT_ID

INNER JOIN InfoPortal.dbo.ISSUE_DG AS i         
                     ON   i.instr_id = p.instr_id

LEFT OUTER JOIN infoportal.dbo.DW_AcctCharDG AS AcctChar
                    ON AcctChar.AcctId = p.acct_ID

GROUP BY
    AcctChar.Chr1Nme
,   P.LOCAL_CURR_CDE
,   T.PortfolioCode
,   T.IAMID 
,   T.Quantity
,   p.FLD1_AMT  
,   I.ISS_TMS
上面的查询返回正确数量的结果,但[ActionType]不正确。它将所有记录显示为“N”,这是不正确的。我需要iif(count(*)>1,“M”,“N”)语句来标识T中是否有任何记录(使用T.PortfolioCode和T.IAMID的唯一组合)来标识T中是否只有一条记录(在这种情况下,ActionType='N'或者如果T中有>1条记录具有相同的PortfolioCode和IAMID组合,则将它们标记为'M'

如果我仅按T.PortfolioCode和T.IAMID分组,则会出现以下错误: 列“AcctChar.Chr1Nme”在select列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。如果我通过将AcctChar.Chr1Nme添加到GROUP BY中,它只会继续执行select语句中的下一个字段,并出现相同的错误


如何为[ActionType]配置iif(COUNT)子句或者GROUP BY只查看T.PortfolioCode和T.IAMID组合,而不是select语句中的所有字段,以仅确定T.PortfolioCode和T.IAMID组合的唯一性?

我自己无法运行它,这有点猜测,但我认为您需要在子查询中计算:

SELECT
,   AcctChar.Chr1Nme             AS [Submitted For Party]   
,   P.LOCAL_CURR_CDE             AS [Notional Currency 1]
,   T.PortfolioCode              AS [Acct_ID]
,   T.IAMID                      AS [IAMID]
,   T.ActionType                 AS [ActionType]
,   p.FLD1_AMT                   AS [Notional]
,   I.ISS_TMS                    AS [EffectiveDte]

from [dbo].[POSITION] AS p

INNER JOIN (select    PortfolioCode  
    ,   IAMID
    ,   iif(count(*) > 1, 'M', 'N')  AS [ActionType]
    from Trades group by PortfolioCode, IAMID
) AS T

INNER JOIN InfoPortal.dbo.ISSUE_DG AS i         
                     ON   i.instr_id = p.instr_id

LEFT OUTER JOIN infoportal.dbo.DW_AcctCharDG AS AcctChar
                    ON AcctChar.AcctId = p.acct_ID

你已经标记了这个
mysql
,但它似乎与
mssql
有关。谢谢你,克里斯,这非常有效。很高兴听到。请随意接受答案:)